2017-03-06 38 views
0

我想了解一個BigDecimal規模,但它行爲怪異,我不明白爲什麼。這裏有幾個例子:BigDecimal規模爲大數

Double d = new Double(1000000d); 
int scale = new BigDecimal(d.toString()).scale(); 

這個例子中的比例是1,這對我來說是正確的。 d.toString()的結果是「1000000.0」。

Double d = new Double(10000000d); 
int scale = new BigDecimal(d.toString)).scale(); 

本例中的比例爲-6。誰能解釋爲什麼? d.toString()的結果是「1.0E7」。

我想到的位數造成這一點,但如果我去:

Double d = new Double(11111111d); 
int scale = new BigDecimal(d.toString()).scale(); 

預期的-8規模,但突然它的0 d.toString的()的結果是「1.1111111E7」。

這些不同的尺度毫無意義的,我讀)規模的Javadoc(後:

返回此BigDecimal的標度。如果爲零或正數,則標度是小數點右側的位數。如果是負數,則該數字的非縮放值乘以10乘以該比例否定的冪。例如,-3的縮放表示未縮放的值乘以1000.

我非常感謝BigDecimal在數字較大時的行爲。

在此先感謝!

+1

在將它傳遞給'new BigDecimal'之前檢查'd.toString()'的值。它可能沒有你認爲它的價值。 – marstran

+0

爲示例添加了d.toString()的結果,對我沒有多大幫助。 –

回答

3

你得到了規模爲小數的一些意義數量:

  • 1000000d - > 1000000.0 - > 0:點右邊的數字沒有意義,其結果是0;
  • 10000000d - > 1.0E7 - > -6:圓點右邊的數字有意義,就好像你用10次方將電源非規範化得到6個零;
  • 11111111d - > 1.1111111E7 - > 0:點右邊的所有數字都有意義,通過十次反正規化得到更多信息,所以如果你想保留這個數字,你就不能「規範」數字信息。這樣(非規格化的數字),你在點的右邊有0個數字。

編輯

至於評論,第一行是錯誤的,它必須是1000000d -> 1000000.0 -> 1。原因是具有指數的數字具有與格式化數字不同的行爲(獲得比例時)。

1值是由於該BigDecimal計數的點(在此情況下是一個,單個0)的右側的數字,減去數下降(在這種情況下有一個,所述單個0)並添加數學精度(缺省值爲1) - > result = 1.

+0

複雜,但我想我明白了:)謝謝! –

+0

'1000000d - > 1000000.0 - > 0'應該是'1' – vossad01

+0

不,應該是'0',因爲0在點的右邊沒有意義 –

1

您所看到的行爲,你的報告,因爲你正在呼籲提供小數,這在你的一些例子代表了指數形式,然後由BigDecimal保存時選擇規模toString()

如果您提供的雙直接把BigDecimal構造你一直得到0。

new Double(1000000d).toString() //1.0E7 

Double d = new Double(1000000d); 
int scale = new BigDecimal(d).scale(); //0 

Double d = new Double(10000000d); 
int scale = new BigDecimal(d).scale(); //0 

Double d = new Double(11111111d); 
int scale = new BigDecimal(d).scale(); //0 

更新:

scale是不是對自己有用的屬性。必須結合unscaledValue來考慮。代表的數字是unscaledValue×10^-scale。

即,

BigDecimal d = new BigDecimal(1000000d) 
BigDecimal e = d.setScale(2) 

int dScale = d.scale() //0 
int dUnscaled = d.unscaledValue() //1000000 

int eScale = e.scale() //2 
int eUnscaled = e.unscaledValue() //100000000 

兩個de1000000的表示。但是,e保留有2個尾隨零(小數點後面的零)。

d.toString() //1000000 
e.toString() //1000000.00 
+0

謝謝!當我初始化我的BigDecimals時,我將使用雙打。 –