程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 表達式之謎,表達式

表達式之謎,表達式

編輯:關於C語言

表達式之謎,表達式


一、判斷奇數

  說到判斷奇數,第一反應就是  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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved