我试图保留两个小数点。我的数字如下:
9.96999.to_f.round(2)
并且大部分时间它们都会四舍五入到两个小数点(9.97
),但偶尔我会得到一个看起来像:
9.96999999999
任何想法为什么?
修改
我正在从刮表中添加两个值。查看表格,唯一的一次是当第一个单元格的值为9.02
且第二个单元格的值为0.95
时,或第一个单元格的值为9.87
时和单元格0.1
中的值。这两次我都应该得到9.97
。相反,我正好得到9.969999999999999
。所有初始值都以字符串开头。
答案 0 :(得分:2)
浮点值本质上是不精确的。许多精确的小数部分没有确切的表示。即便如此,如果你根据计算结果而不是输入结果执行它,你的回合会更好。
很可能你根本不想要圆,但只想控制演示,在这种情况下使用Kernel#sprintf
或String#%
。
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舍入为最接近的整数。 (就这么简单)