Округление возвратило значения с плавающей точкой из БД до их «правильных» значений - PullRequest
2 голосов
/ 10 марта 2011

У меня есть столбец базы данных, который содержит (по какой-то причине потерянный в середине времени) значения с плавающей точкой.

Итак, кто-то заполняет таблицу БД небольшим значением, скажем 0,00025, и когда я запускаю отчет, я на самом деле получаю обратно 0,000249999999 .... или что-то подобное из-за невозможности представить введенное значение.

Есть ли надежный способ взять значение с плавающей запятой и преобразовать обратно в то, что было первоначально введено?

DB - это Sybase.

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

Есть ли надежный способ взять значение с плавающей запятой и преобразовать обратно в то, что было введено изначально?

Нет.Гм, грубо говоря, множество реальных значений, которые могут отображаться в одно значение с плавающей запятой.В БД хранится ближайшее приближение FP к исходной записи;в общем случае существует бесконечное число действительных значений, для которых 0,000249999999 ... является ближайшим приближением FP.

И снова, в общем случае, вы не можете безопасно делать предположения о длине записи.То есть, вы не можете с уверенностью сказать, посмотрев на 0.000249999999, набрал ли пользователь это в прикладной программе, набрал ли пользователь .00025, обновил ли dba этот столбец в результате вычисления (в этом случае «оригинал»)."значение может быть меньше 0,0002499999 и т. д.) и т. д. и т. п.

Но, если вы знаете, сколько цифр вы хотите видеть справа от десятичной точки, вы можете использовать функцию Sybase ROUND ().

0 голосов
/ 10 марта 2011

Это было бы 0,0002498626708984375 ....

Это сводится к "Знай свои данные".Откуда вы знаете, что правильное значение не было 0.0002498626708984375?Вероятно, потому что вы знаете, сколько десятичных знаков было задано изначально.

Используйте эти знания для решения проблемы, приведя к NUMERIC (8, 5) или к какому-либо подходящему решению.

0 голосов
/ 10 марта 2011

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

...