天天看點

Java金額計算的問題

1.包裝類型比對

看代碼

Java金額計算的問題

結果:

Java金額計算的問題

可以看到,兩個包裝類且值都是200的使用 == 的比較的結果都是false 其他都是true 接下來看下源碼一探究竟 

Java金額計算的問題
Java金額計算的問題

通過Integer的源碼可以發現當Integer的範圍是 -128~127的時候是直接從緩存裡面取的傳回值,而超過以後是重新new一個對象傳回,當然使用==的時候就會是false 而Integer 和 int比較的時候包裝類會先轉成int 再做比較,是以不會出現false的情況了,同時大家可以看到在編譯階段編輯器就提示了有問題。

2、多精度計算問題 

Java金額計算的問題

可以看到有兩個計算出現了精度問題 Java中的簡單浮點數類型float和double不能夠精确運算。這個問題其實不是JAVA的bug,因為計算機本身是二進制的,而浮點數實際上隻是個近似值,是以從二進制轉化為十進制浮點數時,精度容易丢失,導緻精度下降

開發中可以通過 BigDecimal 進行數值類型的計算。

資料庫也是一樣,mysql中有float和double類型,通過sql直接累加資料也會有精度缺失的情況。如果要精确的數值計算,要使用mysql的decimal類型 

3、除以0 

除以0其實在數學中是沒有意義的,但是在java的日常開發中有些場景需要特别注意, 雖然這種場景不多,但還是需要特别注意下。 

(1)1除以0 

Java金額計算的問題

(2)0除以0 

Java金額計算的問題

原理是因為java的float和double使用了IEEE 754标準。這個标準規定:浮點數除以0等于正無窮或負無窮。

4、float轉double 

Java金額計算的問題

原因是Float類中有一個doubleValue方法,傳回值是一個double類型,這樣會很容易的以為這是float轉換double類型。但是轉換之後精度缺失了。 

總結:是以在日常開發中一些不起眼的細節往往造就了各種奇奇怪怪的bug,這些細節時時刻刻在提醒着開發者們,注重基礎知識的積累是有多麼重要。 

​​​