我已经将这个简单的函数编码为将doubles舍入为自定义步长。normal.round((函数重新运行int,并且只能四舍五入到最接近的1。我的函数返回一个双精度,可以四舍五入到最近的100.0、5.0、1.0、0.1或0.23,你会得到的
但当我投进某些双打时,结果并没有真正奏效,而且只差一小部分
我认为这与计算机如何进行浮动逗号计算有关,但我需要一种有效的方法来绕过它
在DartPad 上运行
void main() {
stepround(61.337551616741315, 0.1); // this should be 61.3 but is 61.300000000000004
}
/// rounds a double with given steps/precision
double stepround(double value, double steps) {
double rounded = (value / steps).round() * steps;
print(value.toString() + " rounded to the nearest " + steps.toString() + " is " + rounded.toString());
return rounded;
}
正如评论中所提到的,这个问题的原因是计算机处理浮点数的方式。请参阅评论中的链接以获得进一步的解释。
然而,简而言之,这个问题主要是由小数除以或乘以小数引起的。因此,我们可以创建一个与您创建的方法类似的方法,但方法不同。我们将把精度作为内部
I.e:0.1=>10;0.001=>1000
double stepround(double value, int place){
return (value * place).round() / place;
}
示例
// This will return 61.3
stepround(61.337551616741315, 10);
// This will return 61.34
stepround(61.337551616741315, 100);
// This will return 61.338
stepround(61.337551616741315, 1000);
这种方法之所以有效,是因为round()
去除了由乘法引起的小分数。在那之后,我们用一个整数进行除法,这不会产生这样的问题。