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 (web) 控制台检查它。我该怎么做才能获得我的 int 完整号码?

4

1 回答 1

3

因为resultdouble文字,result类型是double.

在 Dart 中 adouble是 a :

IEEE 754 标准规定的 64 位(双精度)浮点数

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

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

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

31878018903828899277492024491376690701584023926880.0例如,这种精度损失并不是 Dart 特有的,31878018903828901761984975061078744643351263313920.0在 Java 中也是如此。

groovy web 控制台为您提供正确的结果,因为带有小数点的AFAICT groovy 文字默认实例化为 java.math.BigDecimal 。

最后还有一个关于 Decimal 数据类型的未解决问题,您可以加注星标,在原生支持小数之前,您可以使用我的decimal 包

于 2013-01-14T14:19:23.077 回答