[英]Dart double division precision
執行此操作的正確方法是什么?
399.9 / 100
我希望看到的是
3.999
但結果是
3.9989999999999997
你看到的結果是正確的,只是不是你想要的。
雙打不是精確的值。 通過寫入 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;
import 'dart:math';
double roundDouble(double value, int places){
double mod = pow(10.0, places);
return ((value * mod).round().toDouble() / mod);
}
那么你基本上會得到
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
要進行十進制運算,您可以使用小數包。
final d = Decimal.parse;
print(d('399.9') / d('100')); // => 3.999
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.