0

我试图保留两位小数。我有这样的数字:

9.96999.to_f.round(2)

大多数情况下,它们会四舍五入到小数点后两位 ( 9.97),但偶尔我会得到一个如下所示的结果:

9.96999999999

任何想法为什么?

编辑

我正在从一个刮掉的表中添加两个值。查看表格,唯一发生这种情况的情况是,单元格一9.02的值为 ,单元格二的值为0.95,或者单元格一9.87的值为 ,单元格二的值为0.1。这两次我显然应该得到9.97。相反,我得到的正是9.969999999999999. 所有初始值都以字符串开始。

4

3 回答 3

2

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

很可能您根本不想要圆形,而只想控制演示,在这种情况下使用Kernel#sprintfor 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

看来您对浮点表示和算术有一些基本的误解。我建议你在遇到麻烦之前阅读它。从这里开始:每个计算机科学家都应该知道的关于浮点运算的知识

于 2013-03-22T21:10:01.913 回答
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
于 2013-03-22T19:43:24.403 回答
-1

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

将 A 舍入为最接近的整数。(就如此容易)

于 2013-03-22T19:47:22.737 回答