Mar*_*arc 6 ruby floating-point
所以这很奇怪.我在Ruby 1.9.3中,并且浮动添加不起作用,因为我预期它会.
0.3 + 0.6 + 0.1 = 0.9999999999999999
0.6 + 0.1 + 0.3 = 1
Run Code Online (Sandbox Code Playgroud)
我在另一台机器上试过这个并获得相同的结果.知道为什么会这样吗?
aka*_*ice 12
浮点运算是不精确的:它们将结果四舍五入到最接近的可表示浮点值.
这意味着每个浮点运算是:
float(a op b) = mathematical(a op b) + rounding-error( a op b )
Run Code Online (Sandbox Code Playgroud)
如上式所示,舍入误差取决于操作数a和b.
因此,如果您以不同的顺序执行操作,
float(float( a op b) op c) != float(a op (b op c))
Run Code Online (Sandbox Code Playgroud)
换句话说,浮点运算不是关联的.
它们是可交换的......
正如其他人所说,将十进制表示0.1(即1/10)转换为基数2表示(即1/16 + 1/64 + ...)将导致无限的数字系列.因此,float(0.1)不等于1/10,它也有一个舍入误差,它导致一系列二进制数字,这说明后面的操作有一个非零舍入误差(数学结果不可表示)在浮点)
之前已经说过很多次了,但还是要重复一遍:浮点数本质上是十进制数的近似值。由于浮点数以二进制存储的方式,有些十进制数无法精确表示。将出现小但可察觉的舍入误差。
为避免这种混乱,您应该始终将数字格式化为适当数量的位置以进行演示:
'%.3f' % (0.3 + 0.6 + 0.1)
# => "1.000"
'%.3f' % (0.6 + 0.1 + 0.3)
# => "1.000"
Run Code Online (Sandbox Code Playgroud)
这就是为什么对货币值使用浮点数是有风险的,并且通常鼓励您对这些事情使用定点数或常规整数。
归档时间: |
|
查看次数: |
2584 次 |
最近记录: |