29.10.2004, 14:03
|
#52
|
Программер
Регистрация: 21.10.2004
Адрес: E-burg
|
Цитата:
Изначально опубликовано Alks
Да нет, же, mazzy, речь то о другом.
Ну и пусть вы храните числа в базе в округленном до n знаков после запятой виде.
Это уменьшит число проблем связанных с данным глюком, но ни в коей мере не избавит от них.
Посмотрите на следующий код - числа a и b совершенно целые, НЕ ДРОБНЫЕ И НЕ БОЛЬШИЕ, но ошибка (именно ошибка, а не тривиальная неточность округления в вещественной арифметике) происходит не при сохранении или извлечении из/в базу, а по ходу промежуточных вычислений над совершенно безобидными числами!!!
PHP код:
static void Summ(Args _args)
{
real a = 1;
real b = 3;
real c = a / b;
;
print 3 * (c + c), " = ", 3 * c + 3 * c, " ?!!!!!";
pause;
}
Вот про то и речь!
(Изначально так и было написано что числа 9999.9999.... получены в результате вычислений, но не извлечены из базы)
Операция деления становится совершенно небезопасной, т.к. может сгенерировать нам периодическую дробь из совершенно нормальных, округленных чисел, которая в свою очередь становится небезопасной при суммировании с другими периодическими дробями!
Это же просто капец какой то.
А вы не используйте промежуточных переменных и все норм будет
|
|