很難解釋,但就是這樣。在java代碼中,我使用了一個雙數(shù),但這個數(shù)字最后得到的數(shù)字非常小,我不想要。也許我需要用更好的方法來得到剩余的。這是代碼:public class MyClass { public static void main(String args[]) { String vRetour = ""; Boolean valeurTrouve = false; double chiffre = .08 ; double valeurTravailDouble = 0; long vIntegerPart = 0; while (! valeurTrouve) { for (int i = 0; i<101;i++) { valeurTravailDouble = chiffre * 8; vIntegerPart = (long) valeurTravailDouble; vRetour = vRetour + vIntegerPart; if ((valeurTravailDouble - vIntegerPart) == 0) { valeurTrouve = true; break; } chiffre = (valeurTravailDouble - vIntegerPart); System.out.println(i + " = " + chiffre); } }}}問題是在最后,我有像第 1 行那樣不需要的數(shù)字,最后我有一個 1。在第 2 行之后,我有一個 9。但是這個數(shù)字的增加和增加在第 17 行給我?guī)砹藟奶帲驗樗黾恿顺蔀槲姨柎a的一部分。0 = 0.641 = 0.12000000000000012 = 0.96000000000000093 = 0.68000000000000684 = 0.440000000000054575 = 0.52000000000043666 = 0.160000000003492467 = 0.28000000002793978 = 0.240000000223517429 = 0.920000001788139310 = 0.3600000143051147511 = 0.88000011444091812 = 0.0400009155273437513 = 0.3200073242187514 = 0.5600585937515 = 0.4804687516 = 0.8437517 = 0.75怎么了,如何在不保留數(shù)字末尾的情況下處理 double ?
3 回答

holdtom
TA貢獻1805條經(jīng)驗 獲得超10個贊
眾所周知,Java 無法正確“添加”。您應該嘗試在代碼中較早地舍入數(shù)字并限制小數(shù)位以防止出現(xiàn)錯誤。用于import java.math.BigDecimal
在完成計算之前進行四舍五入。

慕妹3242003
TA貢獻1824條經(jīng)驗 獲得超6個贊
這不是Java的問題。一般來說,這是計算機中浮點數(shù)的硬件表示問題。Java 并沒有向您“隱藏”這個事實。
該表示有兩個部分。尾數(shù)和指數(shù)。
FP 數(shù)然后表示為M * 2 ^ E
。
現(xiàn)在想象一下這個表示中的數(shù)字 0.1,限制為 3 位(2 + 符號)。要表示的最小片段是 2^-3,即 0.128。因此,嘗試表示 0.1 最終會得到 0.128。使用計算機,精度要大得多,但仍然有限。所以你可以得到更小的差異。
為了證明更大的差異,現(xiàn)在想象 0.1*10 轉換為“我們用 4 位指數(shù)表示,我們得到 0.128*10 = 1.28 !
這是計算機中 FP 數(shù)字的普遍問題。這就是為什么不推薦使用例如比較 FP 數(shù)字的原因a == b
添加回答
舉報
0/150
提交
取消