ОБНОВЛЕНИЕ SQL и SET с числами с плавающей запятой - PullRequest
0 голосов
/ 09 января 2012

В моей базе данных есть радиус поля типа float и значения 0.0.

С помощью сценария PHP я изменяю его значение на содержимое d2, с помощью этого оператора, на 32.422:

$res=mysql_query("UPDATE `astros` SET `radius` = `radius` + ".$d2." WHERE `index` = '".$index."'");

Если позже я использую другой PHP-скрипт для уменьшения значения радиуса на ту же величину:

$res=mysql_query("UPDATE `astros` SET `radius` = `radius` - ".$d2." WHERE `index` = '".$index."'");

окончательное значение не равно 0, как и должно быть, но 1.4988E-9 ... почти ноль.

Может кто-нибудь сказать мне, что я делаю не так?

Спасибо, Direz

Ответы [ 2 ]

1 голос
/ 09 января 2012

В этом нет ничего плохого, вы просто ограничиваете числа с плавающей запятой.

То, что вы считаете точным значением 32,422, не так.При преобразовании из текстового представления в запросе в число с плавающей запятой, используемое базой данных, оно становится самым близким числом, которое можно представить с использованием этого типа данных.Это может быть что-то вроде 32.421999995662, очень близкое к 32.422, но не совсем.

Каждое значение с плавающей запятой может содержать такое отклонение от значения, которое вы намеревались, и когда вы выполняете вычисления с ними, отклонения складываются, ичерез некоторое время вы видите разницу.

Обычно небольшие различия не видны, так как при их отображении числа округляются до разумного количества цифр.Например, если вы вычли 31,422 во втором запросе, вы получите что-то очень близкое к 1, например, 1,00000000014988, которое будет округлено до 1,000000000 при его отображении.Поскольку вы получаете значение, близкое к нулю, нет значения, существенно превышающего отклонение, к которому оно может округляться, поэтому вы видите только отклонение.

0 голосов
/ 09 января 2012

SQL имеет проблемы со значительными цифрами в типах FLOAT и DOUBLE. Попробуйте переключиться на тип DECIMAL с 3 значащими цифрами.

DECIMAL тип: http://dev.mysql.com/doc/refman/5.0/en/precision-math-decimal-changes.html Пример ошибки округления: http://sqlanywhere.blogspot.com/2011/01/be-very-afraid-of-floating-point.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...