一、判斷奇數
說到判斷奇數,第一反應就是 i % 2 == 1;然而這個是有很大問題的;
對負數的判斷而言,其語句是錯誤的!!因為 負數%2 == -1
所以可以改進為 i % 2 != 0;
還可以進一步優化,眾所周知,位運算是特別快的,所以有: i & 1 != 0; ==> 最優方案!!!
二、找零時刻
找零錢:2-1.1 = ?
直接輸出:System.out.println(2-1.1); ==> 0.8999999999999999
這是因為在計算機中並不是所有的小數都可以用二進制精確表示,
若要精確表示可因使用BigDecimal ,且,一定要用BigDecimal(String)
改進:使用printf進行輸出可以實現該功能!!
System.out.printf("%.2f",2-1.1);
優化:使用BigDecimal實現:
System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
三、長整除
long / long
一天中的毫秒數 / 一天中的微秒數
final long weimiao = 24 * 60 * 60 * 1000 * 1000; final long haomiao = 24 * 60 * 60 * 1000; System.out.println(weimiao / haomiao); //5
這是由於weimiao溢出造成的,雖然計算完成的結果不溢出,但是由於在運算過程中是以int類型計算的,weimiao產生溢出,使結果出錯!!!
解決方法很簡單,通過long常量代替int常量作為每一個乘積的因子:
1 final long weimiao = 24L * 60 * 60 * 1000 * 1000; 2 final long haomiao = 24L * 60 * 60 * 1000; 3 4 System.out.println(weimiao / haomiao); //1000
結果正確!!
在操作很大的數字時,千萬要注意溢出問題,拿不准時,就用long來計算!!
四、十六進制
System.out.println(Long.toHexString(0x100000000L + 0xcafebabe)); ==> cafebabe
!如果十六進制或八進制字面常量的最高位被置位了,則,它為負數!!!!
其中long+int ==> 自動轉型為 long+long
且,第二個數符號擴展:
可將第二個數編程long類型,以避免具有破壞力的符號擴展!!
System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL)); ==> 1cafebabe