我注意到Perl 5中的formline方法有一些奇怪的行为。 如果十进制值大于0.5,它将向上舍入。 如果小数值小于0.5,它将向下舍入。 但是当十进制值精确到0.5时,我们通常应该向上舍入但是表格线向下舍入值。
有谁知道这是一个bug还是predesinged?感谢。
答案 0 :(得分:4)
在没有具体演示的情况下,我将指出两个可能的罪魁祸首:
"我们通常应该围捕"绝对是假的。有许多不同的舍入系统。例如,sprintf
使用round-to-even。
$ perl -E'say sprintf "%1\$.1f => %1\$.0f", $_ for 3.5, 4.5, 5.5, 6.5'
3.5 => 4
4.5 => 4
5.5 => 6
6.5 => 6
您认为具有5/10的小数分量的数字实际上并不是由于浮点精度误差造成的。
许多数字是二进制的周期性数据,并且周期数不能准确地存储为浮点数。例如,1 / 10,2 / 10,3 / 10,4 / 10,6 / 10,7 / 10,8 / 10和9/10都是二进制周期性的,就像1/3是十进制的周期性一样(和二进制)。
5/10实际上很容易存储为浮点数(5/10 = 1/2 = 2 -1 ),但是如果你通过算术得到了这个数字,你实际上可能不会有5/10。
$ perl -E'$x += 0.01 for 1..50; say sprintf "%.40f", $x'
0.5000000000000002220446049250313080847263