Java金額計算的問題
點擊上方藍色字體,選擇“標星公眾號”
優(yōu)質文章,第一時間送達
來源 | urlify.cn/iEZBja
簡介:金額計算在一些支付類項目和電商項目中十分常見,很多開發(fā)在日常的寫代碼中時長會使用加減乘除等計算,但是有一些新手同學一旦使用錯了方式,往往會挨上領導的批評,這次就來看下金額計算中的幾個注意點
1.包裝類型比對
看代碼
結果:

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


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

可以看到有兩個計算出現了精度問題 Java中的簡單浮點數類型float和double不能夠精確運算。這個問題其實不是JAVA的bug,因為計算機本身是二進制的,而浮點數實際上只是個近似值,所以從二進制轉化為十進制浮點數時,精度容易丟失,導致精度下降
開發(fā)中可以通過 BigDecimal 進行數值類型的計算。
數據庫也是一樣,mysql中有float和double類型,通過sql直接累加數據也會有精度缺失的情況。如果要精確的數值計算,要使用mysql的decimal類型
3、除以0
除以0其實在數學中是沒有意義的,但是在java的日常開發(fā)中有些場景需要特別注意, 雖然這種場景不多,但還是需要特別注意下。
(1)1除以0

(2)0除以0

原理是因為java的float和double使用了IEEE 754標準。這個標準規(guī)定:浮點數除以0等于正無窮或負無窮。
4、float轉double

原因是Float類中有一個doubleValue方法,返回值是一個double類型,這樣會很容易的以為這是float轉換double類型。但是轉換之后精度缺失了。
總結:所以在日常開發(fā)中一些不起眼的細節(jié)往往造就了各種奇奇怪怪的bug,這些細節(jié)時時刻刻在提醒著開發(fā)者們,注重基礎知識的積累是有多么重要。


