Perl5 formline向下舍入精确值0.5而不是向上舍入

时间:2015-02-10 02:02:45

标签: perl rounding

我注意到Perl 5中的formline方法有一些奇怪的行为。 如果十进制值大于0.5,它将向上舍入。 如果小数值小于0.5,它将向下舍入。 但是当十进制值精确到0.5时,我们通常应该向上舍入但是表格线向下舍入值。

有谁知道这是一个bug还是predesinged?感谢。

1 个答案:

答案 0 :(得分:4)

在没有具体演示的情况下,我将指出两个可能的罪魁祸首:

  1. "我们通常应该围捕"绝对是假的。有许多不同的舍入系统。例如,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
    
  2. 您认为具有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
    
相关问题