【问题标题】:Perl int function and padding zerosPerl int 函数和填充零
【发布时间】:2025-12-07 01:25:01
【问题描述】:
  1. 我有下面的 Perl 函数来显示最多两位小数。当输入值为 2.01 时,它不起作用,输出为 2 而不是 2.01。我不知道为什么要四舍五入。

我将输出写入文件而不是 printf,但它仍然给我 output1 作为 2。

    my $ramount = 2.01;
    $ramount = int($ramount*100)/100;
    printf "output1: $ramount";
  1. 如果我有 .2、.23、.2345、1,23、23.1 和 9 之类的值,我可以使用什么函数来填充零以显示 0.2、0.23、0.2345、1、23、23.1、还有 9 个?

【问题讨论】:

    标签: perl


    【解决方案1】:

    我认为这个序列会回答你的问题:

      DB<1> $a=2.01
    
      DB<2> p $a
    2.01
      DB<3> printf "%20.10f\n", $a
            2.0100000000
    
      DB<4> printf "%20.16f\n", $a
      2.0099999999999998
    
      DB<5> printf "%20.16f\n", ($a*100)
    200.9999999999999716
    
      DB<6> printf "%20.16f\n", ($a*100)/100
      2.0099999999999998
    
      DB<7> printf "%20.16f\n", int($a*100)
    200.0000000000000000
    
      DB<8> printf "%20.16f\n", int($a*100)/100
      2.0000000000000000
    
      DB<9>
    

    本质上(这已在 SO 上多次回答),2.01 不能完全表示为浮点数。如上所示,最接近的浮点数是 2.009999999999999716...

    关于填充,试试

    printf "%04d", $number
    

    格式中的前导零告诉printf(或sprintf)左填充零。

    【讨论】:

      【解决方案2】:

      来自perldoc perlfaq4

      为什么 int() 坏了?

      您的int() 很可能工作正常。这是数字 不是你想的那样。首先看"Why am I getting long decimals (eg, 19.9499999999999) instead of the numbers I should be getting (eg, 19.95)?"的回复。

      比如这个

      print int(0.6/0.2-2), "\n";
      

      在大多数计算机中会打印 0,而不是 1,因为即使如此简单 0.6 和 0.2 的数字不能用浮点数精确表示 数字。你在上面所说的“三”真的更像 2.9999999999999995559。

      【讨论】:

      • 另外,必须注意的是,int() 是截断操作,而不是舍入操作。 I = int(f +0.5) 是显式舍入解。