LINUX.ORG.RU

Perl: что я не нак делаю?

 ,


0

1

Добрый день! Помогите разобрать эту непрятность.

$br должно ровняться 0.7 Почему это не так?

my ($val)= "070";
my ($br) = $val * 0.01;

print "\$br=$br \n"; # выводит $br=0.7

if ($br == 0.7) { print "$br == 0.7   OKey \n"; }
else { print "$br != 0.7   Pl_splash \n"; }


Последнее исправление: T1 (всего исправлений: 1)

Ответ на: комментарий от marvin_yorke

Исправил. Вот как точно уверен.

T1
() автор топика
Ответ на: комментарий от T1
sub TOLERANCE () { 1e-13 }

sub are_equal {
   my ($a, $b) = @_;
   return (abs($a-$b) < TOLERANCE);
}

print('==:        ',    (36.8 == 36.6+0.2)     ?'equal':'unequal', "\n");
print('are_equal: ', are_equal(36.8, 36.6+0.2) ?'equal':'unequal', "\n");

Cite: http://www.perlmonks.org/?node_id=382098

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от Dmitri_Ezhov

Попонятно, почему так происходит. http://ru.wikipedia.org/wiki/Вещественное_число

Непонятно, что делать. Приводить к целому и сравнивать?? Жесть! Я случайн наткнулся... эта трабла неочевидна когда язык изучаешь. Сколько можно таких ошибок понаделать и не знать...

T1
() автор топика
Ответ на: комментарий от T1

Это практически в любом языке с числами с плавающей точкой так.

PolarFox ★★★★★
()
Ответ на: комментарий от T1

смотри на это так: если ты используешь дробные числа с плавающей, а тем более двойной точностью, тебе нужна эта точность. То есть 0.9999999999999999 и 0.9999999999999998 это разные числа, какими бы близкими они ни были и это именно то, зачем нужна плавающая точка. Если такая точность тебе не нужна, ты всегда можешь определить необходимую степень точности сам, это лучше, чем если бы точность была жестко задана, а тебе вдруг потребовалось бы более точное представление

marvin_yorke ★★★
()
Ответ на: комментарий от T1

Приводить к целому и сравнивать??

Эм? |a - b| < eps (выбираемому по ситуации)

anonymous
()

Кстати, можно попробовать воспользоваться небольшим хаком: использовать строковое сравнение (eq) вместо численного (==).

В первом случае оптимизации, которые применяет Perl при показе дробей, помогут 70*0.01 и 0.7 строкофицироваться в одну и ту же строку 0.7, как при print.

AITap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.