Microsoft Access: Советы для случайных пользователейАвтор Allen Browne, декабрь 2007. Обновлено: август 2008. Оригинал Rounding in Access Перевел с английского Александр Артамонов СодержаниеОкругление в АксессеДля округления чисел в Access 2000 и более поздних версих есть встроенная функция Round(). Встроенная функцияИспользуйте функцию Round() в источнике данных текстового поля или в вычисляемом поле запроса. Скажем, у вас есть такое выражение в строке "Поле" в конструкторе запросов: Округление внизЧтобы округлить все дробные цифры до ближайшего целого вниз, используйте Int(): Все эти числа будут округлены вниз до 2: 2,1, 2,5, 2,8, and 2,99. Чтобы округлить вниз до ближайшей копейки (напр. 10,2199 руб становятся 10,21 руб), умножьте на 100, округлите, и затем разделите на 100: Заметьте, что получается при округлении вниз отрицательных величин: Int(-2.1) дает -3, так как это и есть целое число снизу. Чтобы округлять по направлению к нулю, используйте Fix() вместо Int(): Округление вверхЧтобы округлить вверх к ближайшему большему целому, воспользуйтесь способом, которым Int() округляет отрицательные числа: Как показано выше, Int(-2.1) округляет вниз до -3. Поэтому такое выражение округляет 2,1 до to 3. Чтобы округлить вверх до ближайшей копейки, умножьте на -100, округлите, и разделите на -100: Округлить до ближайших 5 копеекЧтобы округлить до ближайших 5 копеек, умножьте число на 20, округлите его, и разделите на 20: Подобным образом, чтобы округлить до ближайшего четвертака, умножьте на 4, округлите, и разделите на 4: Округлить до 1000 руб.Функция Round() в Excel принимает отрицательные числа в качестве количества мест от запятой, напр. Round(123456, -3) округляет до 1000. К сожалению, аксессовская функция этого не поддерживает. Чтобы округлить до ближайших 1000 руб., разделите на 1000, округлите, и умножьте на 1000. Пример: Чтобы округлить до 1000 руб. вниз, разделите на 1000, получите целое число и умножьте на 1000. Пример: Чтобы округлить до верхней 1000 руб., разделите на 1000 и умножьте на -1 перед получением целой величины. Пример: Чтобы округлить в сторону нуля, используйте Fix() вместо Int(). Альтернативно, пользовательская функция Кена Гетца ведет себя в точности как упомнутая экселевская функция. Зачем округлять?Существует свойство Число десятичнызх знаков для полей в таблице/запросе и для текстбоксов в форме/отчете. Это свойство влияет только на то, как поле отображается, а не на то, как оно хранится. Число выглядит округленным, но при сложении ряда чисел (напр. в примечании отчета), итог может "не биться". Округляйте такое поле, когда вы производите вычисление и итоговая сумма сойдется. Это также относится и к денежным полям. Аксесс отображает денежные поля округленными до ближайшей копейки, но хранит их значение до сотой доли копейки (4 знака после запятой.) Банковское округлениеФункция Round() в Аксессе использует "банковское округление". Когда последней значащей цифрой оказывается 5, она округляет до ближайшего четной цифры. Так, 0,125 округляется до 0,12 (2 четно), в то время как 0,135 округляется до 0,14 (4 четно.) Главный смысл здесь - равенство: 1,2,3, и 4 округляются вниз. 6,7,8, и 9 - вверх. 0 не требует округления. Так, если 5 все время округлять вверх, вы получите "сдвинутые" результаты - 4 цифры округляются вниз, и 5 вверх. Чтобы избежать этого, "третий лишний" (5) округляется в соответствии с предыдущей цифрой, что сглаживает неравенство. Если вы не хотите использовать банковское округление, возьмите функцию Кена Гетца (ссылка вверху.) Ошибки плавающей запятойДробные величины компьютер обычно трактует как числа с плавающей точкой. Аксессовские поля типов Двойной точности (Double) или Одинарной точности (Single) относятся к такому типу. Тип "Двойной точности" дает около 15 знаков точности, сингл - 8 знаков (подобно ручному калькулятору). Но эти числа являются приблизительными. Точно так же, как 1/3 требует бесконечного количества знаков в десятичной системе, большинство чисел с плавающей запятой не могут быть представлены точно в двоичной системе. Википедия объясняет проблему точности, с которой вы сталкиваетесь, оперируя числами с плавающей запятой. Резюме заключается в том, что крайние цифры могут не округлиться ожидаемым вами образом,благодаря тому факту, что действительные значения и отображаемые не совпадают. Это становится особенно заметно при проверке банковского округления. Один из способов избежать подобных проблем - использовать числа с фиксированной запятой или мастшабированные числа.Тип данных "Денежный" в Аксессе является типом с фиксированной запятой: он всегда хранит 4 десятичных знака. Например, откройте окно Immediate Window (Ctrl+G) и введите: Денежный тип справляется только с 4 десятичными знаками. Используйте масштабируемый тип Действительный (Decimal), если вам нужно больше знаков после запятой. Округление дат и времениОбратите внимание, что тип Дата/Время в Аксессе является особым видом типа с плавающей запятой, в котором дробная часть обозначает время дня. Следовательно, поля типа Дата/Время с компонентой времени также подвержены ошибкам округления. Функция ниже округляет дату/время до указанного количества секунд. Например, чтобы округлить до ближайшего получаса (30 * 60 seconds), используйте: Public Function RoundTime(varTime As Variant, Optional ByVal lngSeconds As Long = 900&) As Variant
ЗаключениеДля более детального технического объяснения теории округления в целом, см. статью Клайва Максфилда (Clive Maxfield) An introduction to different rounding algorithms. |