Я уверен, что это потому, что тип данных с плавающей запятой (он же Double или Single в MS Access) является неточным. Это не десятичное число, которое является простым значением, масштабируемым степенью 10. Если я правильно помню, значения с плавающей запятой могут иметь разные знаменатели, что означает, что они не всегда точно преобразуются обратно в основание 10.
Лечение состоит в том, чтобы изменить Field1 и Field2 с плавающей / одинарной / двойной на десятичную или валюту Если вы приведете примеры наименьших и наибольших значений, которые вам нужно хранить, включая наименьшие и наибольшие необходимые дроби, такие как 0,0001 или 0,9999, мы, возможно, посоветуем вам лучше.
Имейте в виду, что версии Access до 2007 года могут иметь проблемы с ORDER BY для десятичных значений. Пожалуйста, прочитайте комментарии к этому посту, чтобы узнать больше об этом. Во многих случаях это не будет проблемой для людей, но в других случаях это может быть.
Как правило, float следует использовать для значений, которые могут оказаться очень маленькими или большими (меньшими или большими, чем может содержать десятичная дробь). Вы должны понимать, что float поддерживает более точный масштаб за счет некоторой точности. То есть десятичная дробь будет переполнена или переполнена, когда число с плавающей запятой может просто продолжаться. Но число с плавающей запятой имеет ограниченное количество значащих цифр, тогда как все десятичные числа значимы.
Если вы не можете изменить типы столбцов, то тем временем вы можете обойти проблему, округлив окончательный расчет. Не округляйте до самого последнего возможного момента.
Обновление
Критика моей рекомендации по использованию десятичной дроби была нивелирована, но не в отношении неожиданных результатов ORDER BY, но это значение с плавающей точкой в целом более точное с тем же числом битов.
Нет оспаривания этого факта. Тем не менее, я думаю, что люди чаще работают с ценностями, которые на самом деле учитываются или должны быть выражены в базовой десятке. Я снова и снова вижу вопросы на форумах о том, что не так с их типами данных с плавающей точкой, и я не вижу те же самые вопросы о десятичной дроби. Для меня это означает, что люди должны начинать с десятичной дроби, и когда они будут готовы к прыжку к тому, как и когда использовать float, они могут изучить его и начать использовать, когда они компетентны.
В то же время, хотя может быть немного неприятно, когда люди всегда рекомендуют десятичную , когда вы знаете, что она не столь точна , не позволяйте себе отделиться от реального мира, где более знакомое округление ошибки за счет очень незначительного снижения точности имеют значение.
Позвольте мне указать моим хулителям, что пример
Decimal(1) / 3 * 3
выход 1.999999999999999999999999999
- это, как следует из знакомых слов, «исправить до 27 значащих цифр», что «правильно для всех практических целей».
Так что, если у нас есть два способа сделать то, что практически говорит одно и то же, и оба они могут очень точно представлять числа до смехотворного числа значащих цифр, и оба требуют округления, но один из них имеет заметно более знакомые ошибки округления, чем другие, я не могу согласиться с тем, что рекомендация более знакомой в любом случае плоха. Что делать новичку в системе, которая может выполнить a - a
и не получить 0
в качестве ответа? У него будет путаница, и он будет остановлен в своей работе, пока он пытается это понять. Затем он обратится за помощью на доску объявлений и получит ответ на вопрос "используйте десятичную дробь". Тогда он будет просто в порядке еще пять лет, пока он не вырастет настолько, что однажды ему станет любопытно, и он, наконец, изучит и действительно поймет, что делает поплавок, и сможет использовать его правильно.
Тем не менее, в конечном счете, я должен сказать, что, отбрасывая меня за рекомендацию десятичной дроби, кажется, немного в космическом пространстве.
Наконец, я хотел бы отметить, что следующее утверждение не является строго верным, так как оно обобщенно:
Числа типа float и double хранятся в базе 2, а не в базе 10.
Если быть точным, большинство современных систем хранят типы данных с плавающей точкой с базой 2. Но не все! Некоторые используют или использовали базу 10. Насколько я знаю, существуют системы, которые используют базу 3, которая ближе к e и, таким образом, имеет более оптимальную экономию радиуса, чем представления базы 2 (как если бы это действительно имело значение для 99,999% всех пользователей компьютеров). Кроме того, высказывание «float и double types» может быть немного вводящим в заблуждение, так как double IS float, но float не double. Float - это сокращение от плавающей запятой, но Single и Double являются числами с плавающей запятой подтипов , которые обозначают общую доступную точность. Существуют также типы данных с плавающей запятой Single-Extended и Double-Extended.