Почему в Perl 100*18,35 не сравнивается с 1835?
Когда я запускаю следующий Perl однострочный:
$ perl -e 'print "Oh no!\n" unless 1835 == 100*18.35'
я получил
о нет!
Это почему?
1 ответ
Чего вам не хватает, так это старой проблемы информатики - преобразования с плавающей запятой.
Видите ли, вы не можете точно представить "0,35" как число с плавающей запятой, так как это периодическое число в двоичном виде.
Так что, если вы добавите:
my $new = $a->{a} - $b;
print $new;
Ты получишь:
2.27373675443232e-013
$a->{a}
очень немного больше, чем $b
и, таким образом, тест правильный.
Вы можете увидеть это на работе, если вы:
my $new_val = 18.35 - 18;
print $new_val;
Пока мы на это, хотя - не используйте $a
или же $b
- они зарезервированы для sort
, И имена из одной буквы в любом случае не подходят.
Также my $a = {};
является избыточным - нет необходимости инициализировать пустую хеш-ссылку подобным образом.
Чтобы сделать то, что вы хотите, вам нужно либо сравнить "похожие типы", либо явно привести к целому числу:
$a->{a} = int(18.35 * 100);