2013-04-07 122 views
2

例如我可以用System.Math.Round((float),2)来圆我浮到最近的2位小数的具体数量,但反正是有在F#中,我可以一轮上涨我浮到小数点后2地方呢? 感谢F#四舍五入到小数

回答

3

的hackish解决围捕

let round x d = 
    let rounded = Math.Round(x,d) 
    if rounded < x then x + Math.Pow(10,-d) else rounded 
+0

This Works,thanks。 – user1934312 2013-04-07 09:01:41

+1

呃,一个if分支只是为了四舍五入?加上所需精度的一半,然后轮回,当然! – 2013-04-10 14:30:29

1

围捕(严格起来,而不是从零刚刚离开):

let roundUp x d = 
    Math.Round(x + Math.pow(10,-d)/2,d) 

请考虑四舍五入0.001〜2DP。你想这个四舍五入到0.01:

0.001 + 0.01/2 = 0.006 
-> 2dp: 0.01 

这是从一个共同的方法得出摆脱截断正常的四舍五入;添加一半所需的精度和截断。但是,这会受到负数的影响,因此需要根据原始值的符号减去或增加增量。

请注意,如果您总是四舍五入,那么负数的数字会趋向零。在通常需要2dp的财务状况下,这是一个坏主意,因为0.021的余额四舍五入为0.03,但-0.021的余额四舍五入至-0.02,无论您是计算借记还是贷记。如果你对称地做,例如总是远离零,然后你不再在意。

+0

它甚至比这更糟糕 - 使用默认的RoundToEven行为,一些已经存在的数字是不稳定的。例如,roundUp 1.05 2将产生1.06。你需要在你的回合使用MidPointRounding.AwayFromZero,并确保你总是舍入负数。 – Lamarth 2017-08-28 08:07:52