以下值給我錯誤的精度。僅觀察到具體的數字。這可能是一個浮動表示問題,但想知道具體原因。具體數字的浮點精度
String m = "154572.49"; //"154,572.49";
Float f = Float.parseFloat(m);
System.out.println(f);
輸出它是印刷是154572.48
代替154572.49
。
以下值給我錯誤的精度。僅觀察到具體的數字。這可能是一個浮動表示問題,但想知道具體原因。具體數字的浮點精度
String m = "154572.49"; //"154,572.49";
Float f = Float.parseFloat(m);
System.out.println(f);
輸出它是印刷是154572.48
代替154572.49
。
如果您希望十進制數字與您在Java中輸入的數字完全一致,請使用BigDecimal而不是float。
浮點數是對小數固有不準確的,因爲終止於十進制許多數字(例如0.1)以二進制和浮點數的重複號碼被存儲爲一個二進制表示。
感謝您的回覆,是的,我非常習慣於'BigDecimal',但正在與我遇到的第三方庫合作。 –
你一定要讀這What Every Computer Scientist Should Know About Floating-Point Arithmetic
擠壓無窮多的實數爲有限位數需要一個近似表示。雖然有無限多的整數,但在大多數程序中,整數計算的結果可以存儲在32位中。相反,給定任意固定的位數,大多數使用實數的計算都會產生無法使用多位來精確表示的數量。因此,浮點計算的結果必須經過四捨五入以適應其有限表示。該舍入誤差是浮點計算的特徵。
我正在通過相同的鏈接。謝謝!! –
提供一個十進制數的基部2表示。當你解析時,它解析的十進制數字的二進制表示幾乎不會是確切的。你可以從它的二進制表示中獲得.4856(嗯,我沒有做這個計算,只是猜測讓你知道)。
謝謝@KMC,是的,我明白了。 –
原因是你不能在有限的內存量中表示無限多的數字,比如32位浮點數。因此,您將始終獲得最接近的可表示數字。 – Ingo