近日在群中看到一個小兄弟求助:
int a = 58;double b = 0.35;
double c = a*b;
為什麼等于20.29999999999997
而不是等于20.3
我在計算機思索一,是啊為什麼呢?學習java兩年這個問題突然不知怎麼回答?經過再三考慮将我的想法發表出來,請大家一起讨論!
1. 首先要明白計算機隻識别0和1。
2. 因為在java裡面浮點數的表示是根據IEEE754标準來表示的,
一般數符位(s)1位,階碼(E)根據浮點數的類型不同占的位數不同,尾數(M)也是
根據類型不同占的位數不一樣,是以一個計算機能夠表示的浮點數的總位數長度是有限的
一般32位、64位、80位。
3. 要明白小數在轉換為二進制的時候有些小數是無法完全轉換的隻能取近似值。
4. 如0.35轉為二進制為0.01100..........這個二進制再轉10進制是無法表示為0.35的隻能是無限接近0.35.
這就是所謂的精度丢失,是因為小數在轉二進制時有些小數是轉不清的,丢去了一部分。
是以總結出來出來:再牛逼的計算機也隻認識0和1!
本文轉自 小夜的傳說 51CTO部落格,原文連結:http://blog.51cto.com/1936625305/1140059,如需轉載請自行聯系原作者