Тип данных float

osetr

Столкнулся с такой проблемой, что много записей в базе с большим количеством знаков после запятой из-за типа данных float , например 0,799999999999997 . Но не как не могу понять, почему они такими получаются? Может кто-нибудь пример выражения написать, где что-нибудь аналогичное получится?
9 ответов

osetr

По-моему это обычное дело для математического сопроцессора, который не всегда вещественное правильно округляет. Из-за этого не рекомендуется использовать float для баз. По крайней мере так мой АБД меня учил. Формат NUMBER более надежен.


osetr

Это понятно что лучше number использовать. Но я хочу как-нибудь воссоздать такие значения. Интересно, как они получаются.Например какое-нибудь математическое выражение from dual написать.


osetr

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374 Оттуда:
как они получаются.
Раздел: Примеры «неправильного» поведения вещественных типов
какое-нибудь математическое выражение from dual написать.
Раздел: Бесконечные дробиИзвини за материал по Делфи, просто врядли я так быстро бы нагуглила по Ораклу.


osetr

Ну вот там пишут :Итак, напишем такой код:var R:Single; begin R:=0.1; Label1.Caption:=FloatToStr(R) end;Что мы увидим, когда нажмём кнопку? Разумеется, не «0.1», иначе не было бы смысла писать этот пример. Мы увидим «0.100000001490116». Почему если я напишу
SELECT CAST( 0.1 AS FLOAT) FROM dual
То такого не произойдёт?


osetr

То такого не произойдёт?
Наверное потому, что в Оракле какая-никакая защита. Я поэтому и извиняюсь за статью по Делфи. Как такое симмитировать в СУБД у меня даже представлений нет.


osetr

Для справки: в Oracle единственный тип данных для числовых полей - number. Если при создании таблицы указать что-то другое, то это все равно будет преобразовано к number. Поэтому не стоит даже заморачиваться с другими типами. О чем в SQL Reference прописано черным по белому.


osetr

в Oracle единственный тип данных для числовых полей - number
Даже BINARY_DOUBLE и BINARY_FLOAT тоже конвертируются?


osetr

SELECT CAST(sumfant AS NUMBER(20,5)), CAST(sumfant AS FLOAT(46)), CAST(sumfant AS FLOAT(126)) FROM x WHERE id= 608694
От точности это значение зависит. Скорее всего из-за деления где-то возникает.


osetr

Это понятно что лучше number использовать. Но я хочу как-нибудь воссоздать такие значения. Интересно, как они получаются.
Когда операция производится c реальными float значениями:
--0,010000001
SELECT CAST(0.1 AS binary_float) * CAST(0.1 AS binary_float)
FROM dual;
что много записей в базе с большим количеством знаков после запятой из-за типа данных float , например 0,799999999999997
Если это вас раздражает и у вас есть какая-то принятная точность то просто приводите к ней, я делаю что-то типа такого:
SELECT CAST(0.799999999999997 AS NUMBER(15,2))
FROM dual;
когда работаю с xml, откуда оракл почему-то при использовании min / max xml функций тоже возвращает честный float.