Perl int и нулевые корни

  • У меня есть функция 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?

Ответ 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(), скорее всего, работает нормально. Это цифры, которые не совсем то, что вы думаете. Во-первых, см. Ответ "Почему я получая длинные десятичные знаки (например, 19.9499999999999) вместо чисел я (например, 19,95)?" .

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

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

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