数量大而精确度下降

时间:2013-01-14 13:24:01

标签: dart

我做这个操作,我想要没有指数的结果:

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(web)控制台检查它。 如何获得我的整数?

1 个答案:

答案 0 :(得分:3)

result中有double个文字,result类型为double

在Dart中,double是:

  

64位(双精度)浮点数,由IEEE 754标准

指定

这就是你失去精确度的原因。

您可以使用以下代码查看精度损失:

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

精度损失并非特定于Dart,例如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;