执行此操作的正确方法是什么?
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)
你看到的结果是正确的,只是不是你想要的。
双打不是精确的值。通过写入 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)
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)
| 归档时间: |
|
| 查看次数: |
1115 次 |
| 最近记录: |