为什么在ruby中,这段代码7.30 - 7.20
返回的是0.0999999999999996
而不是0.10
?
但如果我写7.30 - 7.16
,一切都没问题,我会得到0.14
。
问题出在哪里,我该如何解决它?
为什么在ruby中,这段代码7.30 - 7.20
返回的是0.0999999999999996
而不是0.10
?
但如果我写7.30 - 7.16
,一切都没问题,我会得到0.14
。
问题出在哪里,我该如何解决它?
2 ** e
指数存储分数。所以,你有3个选择:
BigDecimal
为了更详细地了解问题,我们可以尝试用二进制表示您的“7.3”。 7部分很容易,是111,但是我们如何表示0.3? 111.1是7.5,太大了,111.01是7.25,越来越接近。结果发现,111.010011是“下一个最接近的较小数”,即7.296875,当我们试图填补缺失的0.003125时,最终我们发现它只是111.010011001100110011...永远不会在有限的比特串中被表示。
这是由于浮点数在内存中的表示方式而导致的常见错误。
如果您需要精确的结果,请使用BigDecimal。
result=BigDecimal.new("7.3")-BigDecimal("7.2")
puts "%2.2f" % result
有趣的是,一个在某个进制下小数位数很少的数字,在另一个进制下可能会有非常多的小数位数。例如,在十进制中,要用无限多的小数位数来表示1/3(=0.3333...),但在三进制中只需要一位小数。同样地,在二进制中,要用很多小数位数来表示数字1/10(=0.1)。
由于您正在进行浮点数运算,因此返回的数字是计算机用于精度的数字。
如果您想要更接近的答案,以一定的精度,请将浮点数乘以该精度(例如乘以100),将其转换为整数,进行计算,然后除以该精度。
还有其他解决方案,但我发现这是最简单的,因为四舍五入似乎总是有些棘手。
这个问题之前已经被问过了,您可能想要查找之前给出的一些答案,比如这个: 处理浮点数精度问题