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?
Ответы
Ответ 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.