2015-02-09 680 views
7

给定一个双精度值,我想将它舍入到小数点后的精度点,类似于PHP的round()函数。如何在Dart中将小数点后面的双精度加倍到精确的精确度?

我可以在飞镖文档找到最接近的事是double.toStringAsPrecision(),但是这并不完全符合我需要的,因为它包括数字前在精度总点数的小数点。

例如,使用toStringAsPrecision(3):

0.123456789 rounds to 0.123 
9.123456789 rounds to 9.12 
98.123456789 rounds to 98.1 
987.123456789 rounds to 987 
9876.123456789 rounds to 9.88e+3 

AS号的幅度增加,我相应的小数点后失去精度。

回答

4
void main() { 
    int decimals = 2; 
    int fac = pow(10, decimals); 
    double d = 1.234567889; 
    d = (d * fac).round()/fac; 
    print("d: $d"); 
} 

打印: 1.23

+0

这是目前最好的做这个。舍入到像0.01这样的精度本身不是一个双精度值,这不是微不足道的。结果可能甚至不能表现为双倍。我强烈建议在小数精度很重要的地方使用整数(例如金钱)。 – lrn 2015-02-10 18:16:17

+1

另外值得指出的是,如果编译为js,那么Dart整数也将开始失去精度,您需要使用如下包:https://pub.dartlang.org/packages/bignum – 2015-02-10 22:03:55

10

请参阅该文档为num.toStringAsFixed()

字符串toStringAsFixed(INT参数fractionDigits)

返回此十进制点串的表示。

在计算字符串表示之前,将其转换为double。

如果该绝对值大于或等于10^21则此方法返回由this.toStringAsExponential计算的指数表示()。否则,结果是最接近的字符串表示形式,精确到小数点后的分数位数。如果fractionDigits等于0,则省略小数点。

参数参数fractionDigits必须是令人满意的整数:0 < =参数fractionDigits < = 20。

实例:

1.toStringAsFixed(3); // 1.000 
(4321.12345678).toStringAsFixed(3); // 4321.123 
(4321.12345678).toStringAsFixed(5); // 4321.12346 
123456789.toStringAsFixed(3); // 123456789.000 
1000000000000000000000.toStringAsFixed(3); // 1e+21 
5.25.toStringAsFixed(0); // 5 
2

num.toStringAsFixed()轮。这一个将你的num(n)转换成你想要的小数位数(2)的字符串,然后在一行代码中分析回你的num:

n = num.parse(n.toStringAsFixed(2));