Ruby round()正在舍入一些数字,而不是其他数字

时间:2013-03-22 19:20:04

标签: ruby floating-point

我试图保留两个小数点。我的数字如下:

9.96999.to_f.round(2)

并且大部分时间它们都会四舍五入到两个小数点(9.97),但偶尔我会得到一个看起来像:

9.96999999999

任何想法为什么?

修改

我正在从刮表中添加两个值。查看表格,唯一的一次是当第一个单元格的值为9.02且第二个单元格的值为0.95时,或第一个单元格的值为9.87时和单元格0.1中的值。这两次我都应该得到9.97。相反,我正好得到9.969999999999999。所有初始值都以字符串开头。

3 个答案:

答案 0 :(得分:2)

浮点值本质上是不精确的。许多精确的小数部分没有确切的表示。即便如此,如果你根据计算结果而不是输入结果执行它,你的回合会更好。

很可能你根本不想要圆,但只想控制演示,在这种情况下使用Kernel#sprintfString#%

pry(main)> f = (9.02 + 0.95)
=> 9.969999999999999
pry(main)> '%.2f' % f
=> "9.97"
pry(main)> 9.02.round(2) + 0.95.round(2)
=> 9.969999999999999
pry(main)> f.round(2)
=> 9.97

看起来你对浮点表示和算术有一些基本的误解。我建议你在遇到麻烦之前先阅读它。从这里开始:What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:0)

这可能是系统而不是Ruby处理浮点的方式。例如,在IRB中尝试这个。

10 - 8.2 - 1.8 #=> don't expect zero here
10 - (8.2 - 1.8) #=> same as above with a different result

答案 2 :(得分:-1)

不要使用.to_f.round() 用这个:  A.round(2) - > anInteger

将A舍入为最接近的整数。 (就这么简单)

相关问题