2
  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?
4

2 回答 2

6

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

  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)左填充零。

于 2012-06-06T05:59:48.513 回答
1

来自perldoc perlfaq4

为什么 int() 坏了?

int()很可能工作得很好。数字和你想的不太一样。首先,请参阅“为什么我得到长小数(例如,19.9499999999999)而不是我应该得到的数字(例如,19.95)?”的答案。.

例如,这个

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

在大多数计算机中将打印 0,而不是 1,因为即使是像 0.6 和 0.2 这样简单的数字也不能用浮点数精确表示。您在上面认为的“三”实际上更像是 2.9999999999999995559。

于 2012-06-06T06:30:58.987 回答