![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнение полей DOUBLE PRECISION в запросе [D7, FireBird 1.5]
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?
таково свойство чисел с плавающей запятой, если коротко. подробнее ищи статью на королевстве, так и называется вроде "особенности чисел с плавающей запятой"