Можно было бы ожидать, что увеличенное значение, возвращаемое предыдущим запросом, будет равно 59950000000,000. Это показывает, что значение 59,95 округляется до значения, которое может быть представлено с конечной точностью, обеспечиваемой двоичным форматом IEEE 754. В данном случае значение находится в пределах одной десятимиллионной, что вполне достаточно для многих расчетов.
Однако округленное значение недостаточно точно для некоторых других видов расчетов. Один из примеров — применение FLOAT в сравнениях на определение равенства. Если для вашей фирмы требуется система видеонаблюдения то заказать её можно недорого тут: http://avansec.com.ua/index.php?option=com_content&view=article&id=51&Itemid=67.
Файл npnMepa:_Rounding-Errors/anti/inexact.sql
SELECT * FROM Accounts WHERE hourly_rate = 59.95;
Результат: пустой набор; совпадающих строк нет.
Выше было показано, что значение, хранящееся в hourly_rate, в действительности несколько больше, чем 59,95. Поэтому хотя данному столбцу и было присвоено значение 59,95 для accountid 123, теперь строка не соответствует условиям предыдущего запроса.
Один из распространенных способов обхода этой проблемы состоит в том, чтобы считать значения с плавающей запятой как «эффективно равные», если они близки друг к другу в пределах небольшого порога. Вычтите одно значение из другого и воспользуйтесь SQL-функцией абсолютного значения ABS (), чтобы убрать знак у разницы. Если результат равен нулю, тогда два значения были в точности равны друг другу. Если результат относительно мал, тогда два значения могут считаться как эффективно равные. Следующий запрос позволяет найти требуемую строку:
Файл npMMepa:_Roundi>ig-Errors/anti/threshold.sql
SELECT * FROM Accounts WHERE ABS (houriy_rate - 59.95) < 0.000001;
Однако разница все еще достаточно велика, так что сравнение с большей точностью потерпит неудачу:
Файл npvmepa:_Rounding-Errors/anti/thre.sho!d.sql
SELECT * FROM Accounts WHERE ABS (hourly__rate - 59.95) < 0.0000001;
Подходящий порог варьируется, так как изменяется абсолютная разница между значением в десятичном формате и округленным значением в двоичном виде.
Еще одним примером природы приближенного характера FLOAT, являющейся источником проблем точности, служит вычисление сводных показателей по многим значениям. Например, если используется функция SUMO для, суммирования значений с плавающей запятой в столбце, суммой накапливается разница, вызываемая округлением всех значений.
Файл npM»epa:_Rounding-Errors/anti/cumulative.sql
Опубликовал vovan666
July 26 2013 08:11:04 ·
0 Комментариев ·
3235 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.