Mysql вопросы расчета: 1 + 1 = 1,9999999999 - PullRequest
5 голосов
/ 30 июля 2009

Проблема в том, что, когда я добавляю два или более двойников из таблицы к представлению, вместо того, чтобы дать мне правильные результаты, он добавляет около десяти или более цифр. Например, 0,5 + 1,5 = 1,99999999998 или 5,5 + 8,5 = 14,0000000001. Есть идеи? (Я знаю, что это своего рода вопрос n00b, и я помню, что имел дело с такими вещами на экзаменах в 9-м классе, но я просто не могу вспомнить, как я это сделал тогда: P)

Ответы [ 6 ]

9 голосов
/ 30 июля 2009

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_format

Вы можете форматировать числа таким образом, если это то, что вы после?

8 голосов
/ 30 июля 2009

Добавление 1 и 1 в виде чисел с плавающей точкой или двойных не должно приводить ни к чему, кроме 2.

Мне трудно поверить, что 0,5 + 1,5 выходит на что-либо, кроме 2.

Все эти числа могут быть правильно представлены в двоичной форме с плавающей запятой.

Мне неприятно говорить, что я не верю вашим примерам, но я не верю. : -)

Однако я верю, что у вас могут быть проблемы с таким числом, как 1.1.

Почему? Потому что 1/10 оказывается повторяющимся десятичным в двоичном.

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


Однако, если ваши примеры действительно так работают, я понятия не имею, что происходит, и я бы хотел знать.

4 голосов
/ 30 июля 2009

числа с плавающей точкой ВСЕГДА являются простыми приближениями. :-) Если точность имеет значение, найдите способ использовать целые числа.

По моему опыту, когда я использовал десятичный тип данных вместо float / double, я всегда получал точные результаты.

3 голосов
/ 30 июля 2009

Эта статья довольно хорошо объясняет проблему.

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

2 голосов
/ 30 июля 2009

Не уверен, что вы ищете объяснение или решение, но поскольку вы уже получили указатели на хорошие объяснения ....

Если вам нужно, чтобы ваши числа вели себя как целые числа, используйте целые числа. Если вам нужна конечная степень точности (т. Е. Два десятичных знака для полей, представляющих деньги), в любом случае сохраните его как целое число, но умножьте его на любой коэффициент 10, который вам нужен, чтобы избавиться от десятичного знака, когда вы помещаете его в базу данных и разделите на то же самое, когда вы вытащите ее обратно.

Таким образом, если вы представляете виджет, который стоит 3,99 доллара, вы помещаете 399 в поле WIDGET.cost.

Не знаю, относится ли это к вашей ситуации или нет. Но общее правило состоит в том, что числа с плавающей точкой ВСЕГДА являются простыми приближениями. :-) Если точность имеет значение, найдите способ использовать целые числа.

2 голосов
/ 30 июля 2009

Не ожидайте целых чисел при работе с типами с плавающей запятой.

...