2013-01-14 105 views
3

我做這個手術,我要的結果,而不指數:大數目,失去精度

main(){ 
    var result = ((1.1+2)+3.14+4+(5+6+7)+(8+9+10)*4267387833344334647677634)/2*553344300034334349999000; 
    print(result); // With exponent 
    print(result.toInt()); // Full number ? 
} 

,並將其打印

3.18780189038289e+49 
31878018903828901761984975061078744643351263313920 

toInt()結果是錯誤的,好的結果是31878018903828899277492024491376690701584023926880。它用groovy(網絡)控制檯檢查它。 我該怎麼做我的int全數?

回答

3

如在result中有double文字,result類型是double

在鏢double是:

64位(雙精度)浮點數字,如IEEE 754標準

這規定就是爲什麼你失去精度。

你可以看到丟失的精度用下面的代碼:

final bignum = 31878018903828899277492024491376690701584023926880; 
print(bignum); 
// displays 31878018903828899277492024491376690701584023926880 
print(bignum.toDouble().toInt()); 
// displays 31878018903828901761984975061078744643351263313920 

這失去的精度不特定於飛鏢,例如31878018903828899277492024491376690701584023926880.031878018903828901761984975061078744643351263313920.0在Java相等。

Groovy Web控制檯爲您提供正確的結果,因爲AFAICT groovy literals with decimal points are instantiated as java.math.BigDecimal by default

終於有an open issue on Decimal data type你可以星和直到小數原生支持,你可以使用我的decimal package;