![]() |
| ||
|
|
Новости |
Поиск |
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. Оказалось, что нет в таблице в базе двух одинаковых значений. Что не так?
Johnmen (2008-05-29 22:31:00) [1]Может пора-таки документацию почитать?
grav (2008-05-29 22:28:00) [2]Если я не знаю какое значение будет хранится в поле, знаю только, что оно будет вещественное. Если я не знаю, сколько цифр будет его целая часть и сколько после запятой. Как можно использовать NUMERIC? Задавать максимальный размер?
grav (2008-05-29 22:20:00) [3]
> Anatoly Podgoretsky © (29.05.08 17:00) [49]
Я про это и написал.
FloatToStr даст 0.1 из 0.100000001490116
Anatoly Podgoretsky (2008-05-29 17:00:00) [4]> grav (29.05.2008 12:28:31) [31]
0.1 тоже нельзя представить
Anatoly Podgoretsky (2008-05-29 16:58:00) [5]> grav (28.05.2008 16:57:10) [10]
.4 не возможно представить в формате с плавающей запятой.
MsGuns (2008-05-29 16:39:00) [6]>Johnmen © (29.05.08 16:11) [45]
>Для IB/FB при определенных значениях NUMERIC и DECIMAL это не так.
Вполне может быть - слишком давно не работал с ИБ
Но дело, в общем, не в этом. Такой подход, ИМХО, весьма полезен СУБД-разработчику при проектировании как бизнес-логики сервера, так и прикладных решений. Дабы не заморачиваться проблемами, подобными сабжевой.
Reindeer Moss Eater (2008-05-29 16:30:00) [7]http://img143.imageshack.us/img143/863/numericdtyl8.jpg
Johnmen (2008-05-29 16:11:00) [8]
> MsGuns © (29.05.08 14:19) [43]
Для IB/FB при определенных значениях NUMERIC и DECIMAL это не так.
Reindeer Moss Eater (2008-05-29 14:38:00) [9]ХРАНЯЩИХСЯ КАК ЧИСЛО С ПЛАВАЮЩЕЙ ТОЧКОЙ
разве?
MsGuns (2008-05-29 14:19:00) [10]NUMERIC, DECIMAL и т.д. служат лишь УКАЗАНИЕМ серверу для ОКРУГЛЕНИЯ УКАЗАННОГО КОЛ-ВА РАЗРЯДОВ при подготовке данных, ХРАНЯЩИХСЯ КАК ЧИСЛО С ПЛАВАЮЩЕЙ ТОЧКОЙ, к отправке клиенту - как они будут обрабатываться на клиенте (округляться, сравниваться, умножаться и т.д. - ему серобуромалиново).
Прежде чем "менять мироощущение", может, стоило бы почитать что-нибудь ? Пока "операторы неустанно вбивают".
Ослик (2008-05-29 13:12:00) [11][41] grav (29.05.08 13:05)
для понимания полезно документацию читать.
нумерик хранит все ввиде целочисленого значения.
например, нумерик(10,3) число 134.56 будет хранить как 134560.
по-крайней мере это справедливо для третьего диалекта ИБ.
grav (2008-05-29 13:05:00) [12]
> Ослик (29.05.08 12:37) [38]
Я и не спорю, но пока обойдусь ABS в запросе.
В основном из-за того, что не понимаю тип NUMERIC. Хотя использую его для больших значений состоящих из целых чисел.
grav (2008-05-29 12:52:00) [13]
> Reindeer Moss Eater © (29.05.08 12:39) [39]
>
> То что сравнивать плавающую точку на равенство в той статье
> не рекомендуют.
С этим согласен.
У меня вообще мироощущение поменялось с сегодняшнего дня. Я теперь компьютерам и калькуляторам не доверяю.
Помнится во времена учебы моей (1993-1999) преподаватели сильно сокрушались по поводу прекращения выпуска и развития семейства СМ и ЕС ЭВМ. Что то как раз говорили про мантиссу, и что интел и в подметки не годится :(
Reindeer Moss Eater (2008-05-29 12:39:00) [14]А чего не так то?
То что сравнивать плавающую точку на равенство в той статье не рекомендуют.
Ослик (2008-05-29 12:37:00) [15][34] grav (29.05.08 12:32)
На тестовой базе пишется и отлаживается скрипт.
Затем в конце рабочего дня после стандартного ежедневного бакапа базы он запускается и на твоих мизерных данных отрабатывает в течении 0.004 секунды.
grav (2008-05-29 12:37:00) [16]
> Reindeer Moss Eater © (29.05.08 12:29) [33]
> А говорил читал статью
А чего не так то?
Я понял, что ни 0.1, ни мои 0.4 (или 13.4) в базу записать точно нельзя. Точно также как и достать из базы. Но если записаны в базу double, то и считаны будут double.
Одно плохо, что мне надо сравнить например, 0.5 записанное в базу и SUM(0.4+0.1). Боюсь, что равенства не будет, а потому ABS мне поможет (наверное)
Reindeer Moss Eater (2008-05-29 12:36:00) [17]сравнивай разность значений с допустмо малой величиной.
Правильный_Вася (2008-05-29 12:36:00) [18]
> 6 операторов с 8 до 17 часов заколачивают в базу данные
> Никто не даст остановить работу.
у тебя в 2 раза больше времени, чем у них - с 17 до 8
grav (2008-05-29 12:32:00) [19]
> Ослик (29.05.08 12:16) [29]
6 операторов с 8 до 17 часов заколачивают в базу данные. Еще 2 ведут контроль на правильность забивки. Никто не даст остановить работу.
Файл программы мне еще удается менять, как только кто то из операторов захочет чайку :)
Reindeer Moss Eater (2008-05-29 12:29:00) [20]А говорил читал статью