1.包裝類型比對
看代碼
結果:
可以看到,兩個包裝類且值都是200的使用 == 的比較的結果都是false 其他都是true 接下來看下源碼一探究竟
通過Integer的源碼可以發現當Integer的範圍是 -128~127的時候是直接從緩存裡面取的返回值,而超過以後是重新new一個對象返回,當然使用==的時候就會是false 而Integer 和 int比較的時候包裝類會先轉成int 再做比較,所以不會出現false的情況了,同時大家可以看到在編譯階段編輯器就提示了有問題。
2、多精度計算問題
可以看到有兩個計算出現了精度問題 Java中的簡單浮點數類型float和double不能夠精確運算。這個問題其實不是JAVA的bug,因為計算機本身是二進制的,而浮點數實際上只是個近似值,所以從二進制轉化為十進制浮點數時,精度容易丟失,導致精度下降
開發中可以通過 BigDecimal 進行數值類型的計算。
數據庫也是一樣,mysql中有float和double類型,通過sql直接累加數據也會有精度缺失的情況。如果要精確的數值計算,要使用mysql的decimal類型
3、除以0
除以0其實在數學中是沒有意義的,但是在java的日常開發中有些場景需要特別注意, 雖然這種場景不多,但還是需要特別注意下。
(1)1除以0
(2)0除以0
原理是因為java的float和double使用了IEEE 754標準。這個標準規定:浮點數除以0等於正無窮或負無窮。
4、float轉double
原因是Float類中有一個doubleValue方法,返回值是一個double類型,這樣會很容易的以為這是float轉換double類型。但是轉換之後精度缺失了。
總結:所以在日常開發中一些不起眼的細節往往造就了各種奇奇怪怪的bug,這些細節時時刻刻在提醒著開發者們,注重基礎知識的積累是有多麼重要。