Колбасня какая-то с округлением!

Staple
Дата: 10.01.2001 18:23:59
Имеем в какой-нибудь колонке c1 типа float значение 9.4900000000000002
и страшное желание округлить его вверх до 2-х знаков после запятой.
Функция ceiling, в общем-то, именно этим и занимается...
Пишем : Update t1 Set c1 = Ceiling(c1*100)/100
В реультате получаем то же самое значение.
Если сделать Update t1 Set c1 = Ceiling(c1*100), то получится 949.0 (что уже неправильно),
однако, вслед за этим после Update t1 Set c1 = с1/100 опять имеем 9.4900000000000002!
Откуда, черт подери?!!!
И это при том, что просто Select ceiling(9.4900000000000002*100)/100 выдает 9.50,
что, собственно, и требуется!
Вот такая, блин, музыка... помогите, люди добрые!
Дед Маздай
Дата: 10.01.2001 21:08:01
Дядя Скрепка, ты решил проверить коллег на знание матчасти? Посмотри внимательно описание типа float: макс.длина 8 байт, макс.точность - 15 знаков после запятой. У тебя последняя двойка стоит на 16-м месте. Передвинь ее на одну позицию влево и снова обретешь душевный покой. Все, что правее 15-го знака во float - белый шум. Так что не удивляйся своим результатам, сам понимаешь: garbage in - garbage out.
Staple
Дата: 11.01.2001 10:35:46
Ой! Виноват! К семи вечера башка уже распухает так, что в дверь не пролезает, зато просыпается болтливость... мог бы и сам догадаться. Спасибо!
febob
Дата: 11.01.2001 19:51:29
Еще надежней это преобразовать в decimal(18,2) или numeric(18,2) а еще надежней хранить их в этих типах в таблице всегда и тогда проблем вообще никогда нет - проверено временем
Staple
Дата: 12.01.2001 11:44:38
Понимаю. Но иногда приходится импортировать данные из таблиц Excel в именно таком виде,
так что decimal и numeric не катят.
Константин
Дата: 14.01.2001 17:03:31
Иногда в общем-то плевать, что где-то в 10 знаке что-то находится. Достаточно принимать в клиента данные в денежном формате ( например, "parameter:=Query1.fields[n].asCurency", в Delphi)
axel
Дата: 15.01.2001 11:18:56
поскольку тема весьма актуальная, позволю себе непозволительную роскошь обратить ваше внимание на некоторые немаловажные моменты:
> Еще надежней это преобразовать в decimal(18,2) или numeric(18,2)
достаточно использовать round(field,2)
> а еще надежней хранить их в этих типах в таблице всегда и тогда проблем вообще никогда
> нет - проверено временем
если используется SQL Links в BDE, то приходится использовать BCD для нормальной работы с точкой в этом случае.
>Иногда в общем-то плевать, что где-то в 10 знаке что-то находится. Достаточно принимать в
>клиента данные в денежном формате ( например, "parameter:=Query1.fields[n].asCurency", в
>Delphi)
оно конечно плевать, но как бы в колодец не попасть при этом в случае, если хранимая процедура считает сумму по таким полям. тогда придется sum(round()) использовать.

итого: если хотим везде прописывать round(,2), то используем типы money,float,etc.
если хотим надежности - используем numeric, помня о BCD.