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

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


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

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

(2)0除以0

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

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


