system.out.println(10.00 - 9.60);
本來期望輸出應該是0.4,結果列印出來的卻是0.40000000000000036,這是為什麼呢?
因為計算機中的浮點數有可能是不準確的,它只能無限接近準確值,而不能完全精確。
使用numberformat雖然能夠列印出0.4,但是往深處考慮,如果涉及到金融行業或會計系統,在大批量的加減乘除後結果會有多大的差距(其中還涉及後面會講到的四捨五入的問題)!會計系統要的就是準確,但是卻因為計算機的緣故不準確了,實在是罪過。
解決這個問題有兩種方法:
1. 使用bigdecimal。
bigdecimal是專門為彌補浮點數無法精確計算的缺憾而設計的類,並且它本身也提供了加減乘除的常用數學演算法。特別是與資料庫decimal型別的字段對映時,bigdecimal是最優的解決方案。
2. 使用整型。
將參與運算的值擴大100倍,並轉變為整型,然後再展現時再縮小100倍,這樣處理的好處是計算簡單、準確,一般在非金融行業應用較多。
用整數型別處理貨幣
在日常生活中,最容易接觸到的小數就是貨幣,比如你付給售貨員10元錢購買乙個9.60元的零食,售貨員應該找你0.4元也就是4毛錢才對,我們來看下面的程式 public class client 我們期望的結果是0.4,也應該是這個數字,但是列印出來的卻是0.40000000000000036,這是為什...
mysql處理貨幣
convert zje,decimal 18,2 1 round x,d 用於資料的四捨五入,round x 其實就是round x,0 也就是預設d為0 這裡有個值得注意的地方是,d可以是負數,這時是指定小數點左邊的d位整數字為0,同時小數字均為0 select round 100.3465,2 ...
mysql裡記錄貨幣用什麼字段型別好?
開發中,貨幣在資料庫中mysql常用decimal和numric型別表示,這兩種型別被mysql實現為同樣的型別。他們被用於儲存值,該值的準確精度是極其重要的值,例如與金錢有關的資料。當宣告乙個類是這些型別之一時,精度和規模的能被 並且通常是 指定 例如 salary decimal 9,2 在這個...