Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сравнение полей DOUBLE PRECISION в запросе [D7, FireBird 1.5]


Страницы:   1 2 3

grav ©   (2008-05-28 16:11:00) 

Есть в таблице поле типа DOUBLE PRECISION.
Все бы хорошо, но значения этих полей отображаются так:
если, например, в поле таблицы значение = 0.4, то в поле DBEdit отобразится 0.39999999898989. Это поправимо, устанавливаем в свойствах IBDataSet для данного поля Precision=5 и имеем в DBEdit 0.4.
Но вот потребовалось сравнить два таких поля в SQL. Оказалось, что нет в таблице в базе двух одинаковых значений. Что не так?


Правильный_Вася   (2008-05-29 12:29:00) [21]


> В SQL есть этот ABS?

подключаем UDF из комплекта поставки (в справке написано как) и радуемся


grav   (2008-05-29 12:28:00) [22]


> Reindeer Moss Eater ©   (29.05.08 12:18) [30]

> property TParam.AsFloat: Double;
>
> А это тоже плавающая точка.

Это и хорошо. Так поля в базе и вставляемые переменные совпадают, поэтому 0.1 так и останется 0.1, а не 0.100000001490116


Reindeer Moss Eater   (2008-05-29 12:18:00) [23]

Мне уже не поменять структуру, там уже десятки тысяч записей.

Хоть миллионы. Не вижу препятствий.

property TParam.AsFloat: Double;

А это тоже плавающая точка.


Ослик   (2008-05-29 12:16:00) [24]

[28] grav   (29.05.08 12:09)
> Мне уже не поменять структуру, там уже десятки тысяч записей.

Да Хоть десять тысяч мульенов. В чем проблема-то?
Вариантов несколько, например делаешь таблицу такую-же таблицу но с другим именем, туда все переливаешь из исходной, дропаешь исходную и создаешь ее уже с правильным полем, переливаешь в нее записи из копии.


grav   (2008-05-29 12:09:00) [25]


> Reindeer Moss Eater ©   (29.05.08 11:52) [27]
> децимал или нумерик + третий диалект.

Мне уже не поменять структуру, там уже десятки тысяч записей.
Да и ParamByName().AsFloat  вроде бы помогло, по крайней мере 0.1 из базы обратно так и считывается как 0.1. И в сравнении они равны.
Из чего делаю вывод, что вставка в поле базы данных типа Double как ParamByName().AsString обрезает числа до типа Single.


Reindeer Moss Eater   (2008-05-29 11:52:00) [26]

децимал или нумерик + третий диалект.


grav   (2008-05-29 11:50:00) [27]


> sniknik ©   (29.05.08 11:35) [25]

Еще раз спасибо за статью. Я в шоке!

var R:Single;
begin
 R:=0.1;
 if R=0.1 then
  Label1.Caption:='Равно'

 else
  Label1.Caption:='Не равно'
end;

Не равно! А ведь и правда число 0.1 не представимо в виде конечной двоичной дроби.


sniknik   (2008-05-29 11:35:00) [28]

> Но там про вещественные типы данных Delphi. Еще бы надо про вещественные  типы данных FireBird.
без разницы, это "машинные" типы, а не "языковые". ты статью то читал? там это понятно расписано.


grav   (2008-05-29 11:28:00) [29]


> Reindeer Moss Eater ©   (29.05.08 10:14) [23]
> А может доки почитаем?

Обязательно почитаем. И уже читаю

> sniknik ©   (28.05.08 17:20) [16]
> http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374

Очень интерессная статья, спасибо за ссылку.
Но там про вещественные типы данных Delphi. Еще бы надо про вещественные  типы данных FireBird.
14,3999996185303 это делфи так берет, или в базе так хранятся?


Reindeer Moss Eater   (2008-05-29 10:14:00) [30]

А может доки почитаем?


grav   (2008-05-29 10:10:00) [31]


> Правильный_Вася   (28.05.08 19:03) [19]

В SQL есть этот ABS?


grav   (2008-05-29 10:02:00) [32]


> MsGuns ©   (28.05.08 22:35) [20]

Какой же тип использовать? NUMERIC?


MsGuns   (2008-05-28 22:35:00) [33]

1. Не использовать в критичных для выборок и ОСОБЕННО для связок полях тип с плавающей точкой.
2. При использовании таких поле в условиях выборки применять к ним "приводящие" операции типа округления или порядка дроби


Правильный_Вася   (2008-05-28 19:03:00) [34]

а сравнивать числа с плавающей точкой можно с учетом погрешности, например,
abs(a-b)<0.00001


Правильный_Вася   (2008-05-28 19:02:00) [35]

используй типы даных с фиксированной точкой


Prohodil Mimo   (2008-05-28 17:52:00) [36]

grav   (28.05.08 17:00) [11]
Уверен, изначально задавал. Но значение Precision не указывал для полей в IBDataSet, может надо было ограничить


не знаю что это такое, и не использовал никогда и работаю с FIBPlus. Но вот 14,3999996185303 не видел ни разу на DOUBLE PRECISION


sniknik   (2008-05-28 17:20:00) [37]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374


Reindeer Moss Eater   (2008-05-28 17:19:00) [38]

читай Data Definition Guide.
раздел "Defining numeric data types"


grav   (2008-05-28 17:08:00) [39]


> Reindeer Moss Eater ©   (28.05.08 17:04) [12]

А надо было чего, чтобы хранить вещественные числа типа 14,4?

Нет, все же виновата моя лень, надо было писать сразу ParamByName().AsFloat. Сейчас вроде нормально сохраняется и суммируется. А старые данные поправим :)
Или все же в другом проблема?


sniknik   (2008-05-28 17:07:00) [40]

> Почему 14,4 стало 14,3999996185303?
таково свойство чисел с плавающей запятой, если коротко. подробнее ищи статью на королевстве, так и называется вроде "особенности чисел с плавающей запятой"


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо