|
Колбасня какая-то с округлением!
|
|||
---|---|---|---|
#18+
Имеем в какой-нибудь колонке 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, 18:23 |
|
Колбасня какая-то с округлением!
|
|||
---|---|---|---|
#18+
Дядя Скрепка, ты решил проверить коллег на знание матчасти? Посмотри внимательно описание типа float: макс.длина 8 байт, макс.точность - 15 знаков после запятой. У тебя последняя двойка стоит на 16-м месте. Передвинь ее на одну позицию влево и снова обретешь душевный покой. Все, что правее 15-го знака во float - белый шум. Так что не удивляйся своим результатам, сам понимаешь: garbage in - garbage out. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2001, 21:08 |
|
Колбасня какая-то с округлением!
|
|||
---|---|---|---|
#18+
Ой! Виноват! К семи вечера башка уже распухает так, что в дверь не пролезает, зато просыпается болтливость... мог бы и сам догадаться. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2001, 10:35 |
|
Колбасня какая-то с округлением!
|
|||
---|---|---|---|
#18+
Еще надежней это преобразовать в decimal(18,2) или numeric(18,2) а еще надежней хранить их в этих типах в таблице всегда и тогда проблем вообще никогда нет - проверено временем ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2001, 19:51 |
|
Колбасня какая-то с округлением!
|
|||
---|---|---|---|
#18+
Понимаю. Но иногда приходится импортировать данные из таблиц Excel в именно таком виде, так что decimal и numeric не катят. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2001, 11:44 |
|
Колбасня какая-то с округлением!
|
|||
---|---|---|---|
#18+
Иногда в общем-то плевать, что где-то в 10 знаке что-то находится. Достаточно принимать в клиента данные в денежном формате ( например, "parameter:=Query1.fields[n].asCurency", в Delphi) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2001, 17:03 |
|
Колбасня какая-то с округлением!
|
|||
---|---|---|---|
#18+
поскольку тема весьма актуальная, позволю себе непозволительную роскошь обратить ваше внимание на некоторые немаловажные моменты: > Еще надежней это преобразовать в 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. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2001, 11:18 |
|
|
start [/forum/topic.php?fid=46&msg=32001512&tid=1827475]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 151ms |
0 / 0 |