我正在做什麼看起來像一個Android應用程序中的簡單數學,但我不斷收到大量舍入錯誤。例如。如何避免Android應用程序開發中的舍入錯誤?
Float.toString(0.4 * 0.4 * 12.5);
我期望得到2作爲上述方程的結果。但是,我得到了2.0000002
我正在做什麼看起來像一個Android應用程序中的簡單數學,但我不斷收到大量舍入錯誤。例如。如何避免Android應用程序開發中的舍入錯誤?
Float.toString(0.4 * 0.4 * 12.5);
我期望得到2作爲上述方程的結果。但是,我得到了2.0000002
所以我最終做出了兩個功能,一個用於旋轉雙打,另一個用於浮動。看起來像一個PITA,但其他然後被限制在一個預設的精度水平(我將看看做一個應用程序設置)它確實有效。
public static float fRound(float Rval, int Rpl) {
float p = (float)Math.pow(10,Rpl);
Rval = Rval * p;
float tmp = Math.round(Rval);
return (float)tmp/p;
}
public static Double dRound(double d, int decimalPlace){
BigDecimal bd = new BigDecimal(Double.toString(d));
bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);
return bd.doubleValue();
}
0.4不能完全用32位IEEE-754浮點數表示。請參閱:
如果你絕對需要任意精度的使用BigDecimal。不過,任意精度數學運算速度較慢。或者使用64位數學(雙打)來提高精度。
浮點數是一個近似數字系統,在你的情況下,0.4不能完全用浮點數表示,所以它表示儘可能接近,所以你不會得到預期的結果。
是否有可用於Android的Round功能?
在這種情況下雙打併沒有太大的區別。雖然我無法在Android的Math lib中找到變精確四捨五入的函數,但我確實拼湊在一起。我只是不喜歡強迫結果進入特定的精確等級。更重要的是,我所做的數學例程有時會產生一個Double,有時候會產生一個Float。沒有找到一種乾淨的方式將所有結果強制爲一種格式。我對BigDecimal不熟悉。很難理解它的用法。 – Kujako 2010-07-12 06:31:32
@Kujako:我不確定我是否理解這個問題。 IEEE-754是我認識的所有CPU實現的一個標準,你必須處理它。 – 2010-07-12 12:40:52
是的,自從我與Java合作以來,這只是一段時間。忘記了一些這些煩惱。儘管如此,我在回覆/回答中詳述的功能確實解決了這個問題。 – Kujako 2010-07-12 17:43:20