Функция Perl int и заполнение нулями

У меня есть функция Perl ниже, чтобы отображать до двух знаков после запятой. Он не работает, когда входное значение равно 2,01, и выдает результат как 2 вместо 2,01. Я не уверен, почему это округление.

Вместо printf я записал вывод в файл, но все равно он дает мне output1 как 2.

    my $ramount = 2.01;
    $ramount = int($ramount*100)/100;
    printf "output1: $ramount";
Если у меня есть значения, такие как .2, .23, .2345, 1,23, 23.1 и 9, какую функцию я могу использовать для заполнения нулей, чтобы она отображала 0,2, 0,23, 0,2345, 1, 23, 23,1 и 9 ?

Ответы на вопрос(2)

perldoc perlfaq4:

Почему int () не работает?

Вашint(), скорее всего, работает просто отлично. Это цифры, которые не совсем то, что вы думаете. Сначала посмотрите ответ на "Почему я получаю длинные десятичные знаки (например, 19,9499999999999) вместо цифр, которые я должен получать (например, 19,95)?".

Например, это

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

на большинстве компьютеров выводит 0, а не 1, потому что даже такие простые числа, как 0,6 и 0,2, не могут быть представлены точно числами с плавающей запятой. То, что вы думаете в вышеприведенном как «три», действительно больше похоже на 2.9999999999999995559.

 BenPen02 нояб. 2016 г., 20:13
Также следует отметить, что int () - это операция усечения, а не операция округления. I = int (f +0.5) - явное решение округления.
Решение Вопроса

Думаю, эта последовательность ответит на твой вопрос:

  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) влево с нуля.

Ваш ответ на вопрос