如何将小数值四舍五入到最接近的0.05值?

22

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

例如:

7.125 -> 7.15

6.66 -> 6.7

如果不可用,是否有人可以提供算法?

5个回答

32

如何尝试以下方法:

Math.Ceiling(myValue * 20) / 20

抱歉,我误解了四舍五入的事情。为了减少混淆,我已经删除了我的评论。 - user37325
1
需要注意的是,尽管这是一个非常好的解决方案来处理任意小数的舍入问题,但在进行小数位舍入时应该使用Math.Round函数(以防有人寻找更标准的舍入解决方案)。 - ICR
8
警告:如果输入值比十进制类型的最大值小20倍(即大约4×10^27),则可能会出错。可以通过减去Math.floor,舍入非整数部分,然后将其加回到floor值来解决此问题。但由于原始提问者的用途是税务计算,除非必须在津巴布韦工作,否则我认为这并不重要... - Steve Jessop
@Steve,哈哈!还有@predator4/user37325,你的评论删除只增加了我的困惑。 - Patrick McDonald
9
一种更简单的方法(并且更容易改变四舍五入步长)是使用 Math.Ceiling(myValue / 0.05) * 0.05。 - Andriy Volkov
显示剩余2条评论

12

使用以下代码:

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

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

ROUND(@mydecimal / 0.05, 0) * 0.05

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


4
Math.Round方法不允许向上舍入。 - Michael Freidgeim
0.5625 应该四舍五入为 0.6,但实际上却是 0.55。最好的解决方法是使用 Math.Ceiling(myValue / 0.05) * 0.05。 - Daniel B
警告:仅适用于想要四舍五入到10的倍数的情况。考虑值2671.875和步长50。我期望得到四舍五入的值2700。2671.875/50 = 53.4375,四舍五入为53。但是53x50 = 2650。 - Georg Patscheider

7

这样的方法对于任何步骤都适用,而不仅仅是0.05步长:

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

2

MidpointRounding.AwayFromZero不允许向上舍入 - 请参见http://msdn.microsoft.com/en-us/library/system.midpointrounding.aspx - Michael Freidgeim

0

在大多数公式中,我无法得到适当的四舍五入。

这个可以“四舍五入”到最近的数字

float roundFloat(float value, float toNearest) {
            float divVal = (1 / (toNearest == 0 ? 1 : toNearest));
            return ((float)(Math.Round(value * divVal)) / divVal);
        }

结果:

roundFloat(2, 0.125F); -> 2
roundFloat(2.11, 0.125F); -> 2.125
roundFloat(2.22, 0.125F); -> 2.25
roundFloat(2.33, 0.125F); -> 2.375
roundFloat(2.44, 0.125F); -> 2.5
roundFloat(2.549999, 0.125F); -> 2.5
roundFloat(2.659999, 0.125F); -> 2.625
roundFloat(2.769999, 0.125F); -> 2.75
roundFloat(2.879999, 0.125F); -> 2.875
roundFloat(2.989999, 0.125F); -> 3

例子 0.125 最近的四舍五入

 2.000 
 2.125 
 2.250 
 2.375 
 2.500 
 2.625 
 2.750 
 2.875 
 3.000 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接