2009-07-29 3 views
5

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

+0

Что именно вы спрашиваете? Вы хотите знать, почему это происходит? Или вы просто хотите дать правильные результаты? – Velociraptors

+7

Это стандартный вопрос с плавающей точкой. Пожалуйста, найдите SO для [с плавающей точкой] для более чем 100 подобных вопросов. Один из них может вам помочь. –

+2

мой учитель математики средней школы сказал нам, что .9999 ... = 1, поэтому я не понимаю, в чем проблема? :) – Jason

ответ

2

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

+2

Я бы зашел так далеко, чтобы сказать: «Если вы не знаете намеченной цели типов с плавающей точкой, не используйте их». И «отслеживать гроши» или «добавить десятичное место» не является целью. – quillbreaker

3

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

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

2

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

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

Итак, если вы представляете виджет стоимостью $ 3,99, вы помещаете 399 в поле WIDGET.cost.

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

8

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

Я считаю, что трудно поверить, что 0,5 + 1,5 выходит ни к чему, но 2.

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

Ненавижу говорить, что я не верю вашим примерам, но я этого не делаю. :-)

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

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

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

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

+0

На самом деле да, примеры - это просто примеры. Реальная проблема включает в себя много SUM из разных таблиц, и я думаю, что это не помогло бы опубликовать весь процесс ... – Ant

+5

Я знал это! Ваши примеры имели запах подлинности только до тех пор, пока я не обратил на них внимание. Поэтому я даю вам +1 для успешного обмана. Вы можете сказать, что SOers видели подобные вопросы столько раз, что мы их больше не читаем. :-) – Nosredna

4

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^