Страница 1 из 1

точность вычислений....

Добавлено: 18 апр 2007, 15:29
aaa3d
FB CS 1.53 linux, windows

такой вот запрос

select 4.5*0.95, 4.5*(1-0.05) from rdb$database

дает такой вот результат результат:
(если в эксперте поставить большую точность при выводе float полей)
F_1 F_2
4.275000000000000360000 4,274999999999999470000

конечно, формат double имеет ограничение, но почему число разное???
если я его дальше передаю в UDF, которая его округляет до 2 знаков, получаю 2 разных числа: 4,28 и 4,27.
вот такая бяка.... кто нибудь сталкивался? как победить?

Добавлено: 18 апр 2007, 16:09
Dimitry Sibiryakov
Что-то ты не договариваешь... Откуда там плавающая точка? Первый диалект?

Добавлено: 18 апр 2007, 16:16
hvlad
Выполни этот же запрос в isql заодно

Код: Выделить всё

SQL> SELECT 4.5*0.95, 4.5*(1-0.05) FROM RDB$DATABASE ;

               MULTIPLY                MULTIPLY
======================= =======================
      4.275000000000000       4.275000000000000
Похоже, ИБЕ тебе даёт несколько больше, чем 15 знаков после запятой (вас обманули - вам дали больше (с) :lol: )

PS на будущее - почему ты решил, что 1-0.05 == 0.95 ?

Добавлено: 18 апр 2007, 16:16
aaa3d
да, диалект первый.
просто в базе которую поддерживаю в одних местах
идет расчет по первой схеме, а в других - по второй.
соответственно теряются копейки блин

Добавлено: 18 апр 2007, 16:23
WildSery
Перепиши UDF, там округление неправильное, не учитывает особенностей double.

Добавлено: 18 апр 2007, 16:50
aaa3d
PS на будущее - почему ты решил, что 1-0.05 == 0.95 ?
было такое подозрение, довольно сильное.

удфку переписывать неохота...


вот так нифига себе :( блин.... ну и засада

select 4.5*0.95*1E5, 4.5*(1-0.05)*1E5, 0.95*1e5, (1-0.05)*1e5 from rdb$database

результат

427500.000000000058 427499.999999999942 95000 95000

Добавлено: 18 апр 2007, 17:39
WildSery
aaa3d писал(а):удфку переписывать неохота...
Тогда посредством CAST округляй.