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の完全な番号を取得するにはどうすればよいですか?

4

1 に答える 1

3

リテラルresultがあるように、タイプはです。doubleresultdouble

Dartではadoubleは:

IEEE 754標準で指定されている64ビット(倍精度)浮動小数点数

これが精度を失う理由です。

次のコードを使用すると、精度が低下していることがわかります。

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

この精度の低下は、たとえばDartに固有のものではなく31878018903828899277492024491376690701584023926880.031878018903828901761984975061078744643351263313920.0Javaでも同じです。

小数点付きのAFAICTgroovyリテラルはデフォルトでjava.math.BigDecimalとしてインスタンス化されるため、groovyWebコンソールは正しい結果を提供します。

最後に、スターを付けることができるDecimalデータ型に未解決の問題があり、decimalsがネイティブにサポートされるまで、私のdecimalパッケージを使用できます。

于 2013-01-14T14:19:23.077 に答える