2011年6月28日 星期二

java的數字

一.
System.out.println(1-0.8);

上一句的輸出是:

0.19999999999999996

前公司業務跟錢有關
所以在處理小數有關的東西
一律都是用BigDecimal類別

System.out.println((new BigDecimal("1").subtract(new BigDecimal("0.8"))));

上一句的輸出是:

0.2

二.
System.out.println(365*(1+1000000000000000));

上一句的輸出是:

integer number too large: 1000000000000000

要解決這個問題很簡單
只要加個L就解決了
System.out.println(365*(1+1000000000000000L));

這其中的奧妙
就在於JAVA
作四則運算時
會把運算子旁邊的兩個運算元
都提升到較大運算元的型別後
再開始計算
這個叫作Promotion
(
註:Promotion指由小型別換到大型別
這會自動發生
Cast則指由大型別換到小型別
這就要由程式員特別指定


還有
JAVA基本型別的大小
可以參這篇文章
byte<short<int<long<float<double
浮點數型別的double和float都比整數型別的long還要大
這是因為這float和double
主要用來儲存小數數值,也可以用來儲存範圍更大的整數 
)

以本例而言
1+1000000000000000L
在JAVA中所有整數都預設為int
而所有小數都預設為double
但是加了個L
就把該整數提升為long型別

所以
1000000000000000先變成了long
->1+1000000000000000L = int + long = long + long = long
接著365*long = int * long = long * long = long = 365000000000000365
轉成long型別後就能裝下 365000000000000365 這麼大的數字了

1 則留言:

  1. diamond edge titanium - vitanium-arts.com
    diamond edge titanium - titanium element vitium-arts.com. Product ID: 07978339. titanium tent stakes Product Description. We will nano titanium by babyliss pro give you an 2020 ford ecosport titanium update when we find the missing pieces. The original $3.80 titanium flash mica · ‎In stock

    回覆刪除