关于java double类型运算的困惑
高洛峰
高洛峰 2017-04-17 17:41:32
0
2
340

请看下面的代码

double a = 0.001;
double b = 13.456;
System.out.println(a);
System.out.println(b);
System.out.println(a+b);
System.out.println(b-a);

运算的结果是

0.001
13.456
13.456999999999999
13.455;

表示对结果不太理解,难道ab相加的结果不应该是13.457么

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(2)
迷茫

double 在運算時會失去精確度,建議使用java.math.BigDecimal 進行運算。

小葫芦

這是因為在計算機中浮點數有可能(注意是可能)是不準確的,它只能無限接近準確值,而不能完全精確。為什麼會如此呢?這是由浮點數的儲存規則決定的,我們先來看0.4這個十進制小數如何轉換成二進制小數,使用“乘2取整,順序排列”法(不懂?這就沒招了,太基礎了),我們發現0.4不能使用二進制準確的表示,在二進制數世界裡它是一個無限循環的小數,也就是說,“展示”都不能“展示”,更別說是在內存中存儲了(浮點數的儲存包括三個部分:符號位、指數位、尾數,具體不再介紹),可以這樣理解,在十進制的世界裡沒有辦法準確表示1/3,那在二進制世界裡當然也無法準確表示1/5 (如果二進制也有分數的話倒是可以表示),在二進制的世界裡1/5是一個無限循環小數。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板