请看下面的代码
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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
double 在運算時會失去精確度,建議使用java.math.BigDecimal 進行運算。
這是因為在計算機中浮點數有可能(注意是可能)是不準確的,它只能無限接近準確值,而不能完全精確。為什麼會如此呢?這是由浮點數的儲存規則決定的,我們先來看0.4這個十進制小數如何轉換成二進制小數,使用“乘2取整,順序排列”法(不懂?這就沒招了,太基礎了),我們發現0.4不能使用二進制準確的表示,在二進制數世界裡它是一個無限循環的小數,也就是說,“展示”都不能“展示”,更別說是在內存中存儲了(浮點數的儲存包括三個部分:符號位、指數位、尾數,具體不再介紹),可以這樣理解,在十進制的世界裡沒有辦法準確表示1/3,那在二進制世界裡當然也無法準確表示1/5 (如果二進制也有分數的話倒是可以表示),在二進制的世界裡1/5是一個無限循環小數。
double 在運算時會失去精確度,建議使用java.math.BigDecimal 進行運算。
這是因為在計算機中浮點數有可能(注意是可能)是不準確的,它只能無限接近準確值,而不能完全精確。為什麼會如此呢?這是由浮點數的儲存規則決定的,我們先來看0.4這個十進制小數如何轉換成二進制小數,使用“乘2取整,順序排列”法(不懂?這就沒招了,太基礎了),我們發現0.4不能使用二進制準確的表示,在二進制數世界裡它是一個無限循環的小數,也就是說,“展示”都不能“展示”,更別說是在內存中存儲了(浮點數的儲存包括三個部分:符號位、指數位、尾數,具體不再介紹),可以這樣理解,在十進制的世界裡沒有辦法準確表示1/3,那在二進制世界裡當然也無法準確表示1/5 (如果二進制也有分數的話倒是可以表示),在二進制的世界裡1/5是一個無限循環小數。