簡體   English   中英

飛鏢雙分精度

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM