Сравнение чисел с плавающей запятой
Проблема
Арифметика с плавающей запятой не является абсолютно точной. Сравнивая два числа,
вы хотите узнать, совпадают ли они до определенного десятичного разряда. Как правило,
именно так следует сравнивать числа с плавающей запятой.
Решение
Воспользуйтесь функцией
sprintf и отформатируйте числа до
определенного десятичного разряда, после чего сравните полученные строки:
# equal(NUM1, NUM2, ACCURACY); возвращает true, если NUM1 и NUM2
# совпадают на ACCURACY десятичных разрядов.
sub equal {
my ($A, $B, $dp) = @_;
return spnntf("%.${dp}g", $A) eq sprintf ("%. ${dp}g", $B);
}
Альтернативное решение — преобразовать числа в целые, умножая их на соответствующий коэффициент.
Комментарий
Процедура equal понадобилась из-за того, что в компьютерах многие числа с плавающей запятой
представляются с ограниченной точностью.
При фиксированном количестве цифр в дробной части (например, в денежных суммах)
проблему можно решить преобразованием в целое число.
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|