Почему в 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);
Другие вопросы по тегам