2009-02-20 47 views
4

首先看到以下問題:值得推薦的辦法值

SetRoundMode(rmUp) and rounding 「round」 values like 10, results in 10,0001.

我需要四捨五入的貨幣值了,所以0.8205變爲0.83,但上面顯示的SimpleRoundTo行爲給我一些頭痛。

如何以安全的方式將貨幣值整理起來?

+0

也許這個問題可以揭示你的問題:http://stackoverflow.com/questions/182475/how-to-avoid-rounding-problems-when-comparing-currency-values-in-delphi – 2009-02-20 12:36:20

回答

6

可以使用ceil函數:

newvalue := Ceil(oldvalue * 100)/100; 
3

需要注意的是四捨五入0.8205高達0.83,也四捨五入0.8305高達0.84,將導致您的舍入平均一個向上的偏差。默認舍入模式是銀行家四捨五入,向偶數舍入以避免定向偏差。

如果您的計算有複式性質,這一點尤其重要。用定向偏差舍入可能會導致任何一方不匹配。

使用SetRoundMode更改FPU控制字。請注意,在根據Currency類型(這是一個定點類型(縮放的64位整數))考慮時,在FPU模式舍入應用於浮點運算時可能並不明顯。即使預計爲Currency的值預計爲82.00,中間浮點計算(如82.000000000000001)中的一個小的不精確性也會變爲四捨五入。更改線程全局舍入模式只能謹慎操作。

1

你做錯了。

不要使用浮動來表示重要的類型,如時間和金錢!

使用代表您需要的最高精度的整數。例如,使用一個代表千分之一的整數。然後你可以繞過82050左右,當你最後需要把它顯示爲一個字符串然後只有你做整數計算舍入。

要真正回答您的問題,不應將$ 0.8205四捨五入。應該是0.825美元。

+0

這是什麼我也在Delphi中看過,沒有固定的十進制類型。 – flatline 2009-02-20 18:04:50