有没有办法将十进制值四舍五入到.Net中最接近的0.05值?
例如:
7.125-> 7.15
6.66-> 6.7
如果现在可用,谁能给我算法?
怎么样:
Math.Ceiling(myValue * 20) / 20
使用此:
Math.Round(mydecimal / 0.05m, 0) * 0.05m;
可以在T-SQL中使用相同的逻辑:
ROUND(@mydecimal / 0.05, 0) * 0.05
我更喜欢这种方法而不是selected answer,因为您可以直接看到所使用的精度。
类似这样的步骤应该适用于任何步骤,而不仅仅是0.05:
private decimal RoundUp (decimal value, decimal step)
{
var multiplicand = Math.Ceiling (value / step);
return step * multiplicand;
}
Math..::.Round Method (Decimal, Int32, MidpointRounding)
将双精度浮点值四舍五入为指定的小数位数。参数指定如果值在其他两个数字之间的中间值,则如何舍入。
Math.Round(1.489,2,MidpointRounding.AwayFromZero)
这里是一个解决方案,如果您不希望舍入到10、100、1000等,也可以使用。(其他逐步大小会破坏计算分数的其他答案,四舍五入,然后将分数乘以逐步大小) 。它使用Math.Round,因此也可能会四舍五入。
将破坏其他实现的测试数据:输入2671.875,步长为50,预期结果为2700。
[其他实现方式因为2671.875 / 50 = 53,4375而中断,它将四舍五入为53,但53x50为2650。]
private double RoundToStepSize(double value, double stepSize, MidpointRounding mode) { // use decimal for this operation to reduce errors due to internal representation of double var decimalValue = (decimal) value; var decimalStepSize = (decimal) stepSize; var requiredPrecision = GetDecimalPlaces(decimalStepSize); var shouldRoundUp = Math.Round(decimalValue, requiredPrecision, mode) >= decimalValue; var fullFractions = Math.Floor(decimalValue / decimalStepSize); if (shouldRoundUp) { fullFractions += 1; } return (double) (fullFractions * decimalStepSize); }
int GetDecimalPlaces(decimal)
返回小数点“。”后的小数位数,例如参见Find number of decimal places in decimal value regardless of culture 。