如何将十进制值四舍五入到最接近的0.05值?

问题描述 投票:18回答:6

有没有办法将十进制值四舍五入到.Net中最接近的0.05值?

例如:

7.125-> 7.15

6.66-> 6.7

如果现在可用,谁能给我算法?

c# .net algorithm decimal rounding
6个回答
27
投票

怎么样:

Math.Ceiling(myValue * 20) / 20

10
投票

使用此:

Math.Round(mydecimal / 0.05m, 0) * 0.05m;

可以在T-SQL中使用相同的逻辑:

ROUND(@mydecimal / 0.05, 0) * 0.05

我更喜欢这种方法而不是selected answer,因为您可以直接看到所使用的精度。


6
投票

类似这样的步骤应该适用于任何步骤,而不仅仅是0.05:

private decimal RoundUp (decimal value, decimal step)
{
    var multiplicand = Math.Ceiling (value / step);
    return step * multiplicand;
}

2
投票

Math..::.Round Method (Decimal, Int32, MidpointRounding)

将双精度浮点值四舍五入为指定的小数位数。参数指定如果值在其他两个数字之间的中间值,则如何舍入。

   Math.Round(1.489,2,MidpointRounding.AwayFromZero)

1
投票

对于红宝石和蟒蛇,复制了herehere。不应有太大区别。


0
投票

这里是一个解决方案,如果您不希望舍入到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

© www.soinside.com 2019 - 2024. All rights reserved.