2013-04-07 123 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