2
  1. 以下のPerl関数を使用して、小数点以下2桁まで表示します。入力値が 2.01 の場合は機能せず、出力が 2.01 ではなく 2 になります。なぜ丸めているのかわかりません。

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 を浮動小数点数として正確に表すことはできません。上記のように、最も近い float は 2.009999999999999716... です。

パディングについては、試してみてください

printf "%04d", $number

フォーマットの先頭のゼロは、printf(またはsprintf) 左にゼロを埋め込むように指示します。

于 2012-06-06T05:59:48.513 に答える
1

からperldoc perlfaq4:

int() が壊れているのはなぜですか?

あなたint()はおそらくうまく機能しています。あなたが思っているほどではない数字です。最初に、 「取得すべき数値 (例: 19.95) ではなく、長い 10 進数 (例: 19.9499999999999) になっているのはなぜですか?」に対する回答を参照してください。.

たとえば、これ

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

ほとんどのコンピュータでは、1 ではなく 0 を出力します。これは、0.6 や 0.2 のような単純な数値でさえ、浮動小数点数では正確に表すことができないためです。上記で「3」と考えているものは、実際には 2.9999999999999995559 に似ています。

于 2012-06-06T06:30:58.987 に答える