飞镖双分精度

Dro*_*idT 3 dart

执行此操作的正确方法是什么?

399.9 / 100
Run Code Online (Sandbox Code Playgroud)

我希望看到的是

3.999
Run Code Online (Sandbox Code Playgroud)

但结果是

3.9989999999999997
Run Code Online (Sandbox Code Playgroud)

lrn*_*lrn 7

你看到的结果是正确的,只是不是你想要的。

双打不是精确的值。通过写入 399.9 得到的 double 实际上是精确值。

399.8999999999999772626324556767940521240234375

这是最接近精确值 399.9 的可用双精度值。任何其他双精度值都至少与 399.9 相差那么远。

然后除以 100。同样,结果并不精确,但最接近的双精度值具有精确值

3.99899999999999966604491419275291264057159423828125

这与您通过编写 3.999 得到的不同,这是确切的值:

3.999000000000000110134124042815528810024261474609375

在每一步,double 运算都将误差最小化,但是由于您执行了多个步骤,因此最终结果与最接近数学结果的 double 有所不同。

您需要做什么取决于您的实际需求。

如果您想始终使用两位有效数字进行计算,那么我只需将我的数字乘以 100 并将所有运算作为整数运算进行,直到最后除以 100。

如果您有一个中间结果并希望将其四舍五入为两位数,我会按照 Fy Z1K 所说的进行操作:

  result = (result * 100).round() / 100;
Run Code Online (Sandbox Code Playgroud)


Fy *_*Z1K 5

import 'dart:math';

double roundDouble(double value, int places){ 
    double mod = pow(10.0, places); 
    return ((value * mod).round().toDouble() / mod); 
}
Run Code Online (Sandbox Code Playgroud)

那么你基本上会得到

double num1 = roundDouble(12.3412, 2);
// 12.34

double num2 = roundDouble(12.5668, 2);
// 12.57

double num3 = roundDouble(-12.3412, 2);
// -12.34

double num4 = roundDouble(-12.3456, 2);
// -12.35
Run Code Online (Sandbox Code Playgroud)