Access функция округления
Округление в Аксессе
Для округления чисел в Access 2000 и более поздних версих есть встроенная функция Round().
Для более ранних версий используйте вот эту пользовательскую функцию округления Кена Гетца.
Встроенная функция
Используйте функцию Round() в источнике данных текстового поля или в вычисляемом поле запроса.
Скажем, у вас есть такое выражение в строке «Поле» в конструкторе запросов:
Налог: [Стоимость] * [СтавкаНалога]
Чтобы округлить до ближайшей копейки, используйте:
Налог: Round([Стоимость] * [СтавкаНалога], 2)
Округление вниз
Чтобы округлить все дробные цифры до ближайшего целого вниз, используйте Int():
Int([МоеПоле])
Все эти числа будут округлены вниз до 2: 2,1, 2,5, 2,8, and 2,99.
Чтобы округлить вниз до ближайшей копейки (напр. 10,2199 руб становятся 10,21 руб), умножьте на 100, округлите, и затем разделите на 100:
Int(100 * [МоеПоле]) / 100
Заметьте, что получается при округлении вниз отрицательных величин: Int(-2.1) дает -3, так как это и есть целое число снизу. Чтобы округлять по направлению к нулю, используйте Fix() вместо Int():
Fix(100 * [МоеПоле]) / 100
Округление вверх
Чтобы округлить вверх к ближайшему большему целому, воспользуйтесь способом, которым Int() округляет отрицательные числа:
— Int( — [МоеПоле])
Как показано выше, Int(-2.1) округляет вниз до -3. Поэтому такое выражение округляет 2,1 до to 3.
Чтобы округлить вверх до ближайшей копейки, умножьте на -100, округлите, и разделите на -100:
Int(-100 * [МоеПоле]) / -100
Округлить до ближайших 5 копеек
Чтобы округлить до ближайших 5 копеек, умножьте число на 20, округлите его, и разделите на 20:
Round(20 * [МоеПоле], 0) / 20
Подобным образом, чтобы округлить до ближайшего четвертака, умножьте на 4, округлите, и разделите на 4:
Round(4 * [МоеПоле], 0) / 4
Округлить до 1000 руб.
Функция Round() в Excel принимает отрицательные числа в качестве количества мест от запятой, напр. Round(123456, -3) округляет до 1000. К сожалению, аксессовская функция этого не поддерживает.
Чтобы округлить до ближайших 1000 руб., разделите на 1000, округлите, и умножьте на 1000. Пример:
1000 * Round([Стоимость] / 1000, 0)
Чтобы округлить до 1000 руб. вниз, разделите на 1000, получите целое число и умножьте на 1000. Пример:
1000 * Int([Стоимость] / 1000)
Чтобы округлить до верхней 1000 руб., разделите на 1000 и умножьте на -1 перед получением целой величины. Пример:
-1000 * Int( [Стоимость] / -1000)
Чтобы округлить в сторону нуля, используйте 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) и введите:
? Round(CCur(.545),2), Round(CDbl(.545),2)
Денежный тип (первый) возвращает 0,54, тогда как Двойной точности — 0,55. Денежный округляет корректно (к четной цифре 4); тип с плавающей запятой (Двойной точности) некорректно. Подобным образом, если вы попробуете 8,995, Денежный корректно округлит вверх (к четной цифре 0), в то время как тип Двойной точности округлит вниз (неверно.)
Денежный тип справляется только с 4 десятичными знаками. Используйте масштабируемый тип Действительный (Decimal), если вам нужно больше знаков после запятой.
Округление дат и времени
Обратите внимание, что тип Дата/Время в Аксессе является особым видом типа с плавающей запятой, в котором дробная часть обозначает время дня. Следовательно, поля типа Дата/Время с компонентой времени также подвержены ошибкам округления.
Функция ниже округляет дату/время до указанного количества секунд. Например, чтобы округлить до ближайшего получаса (30 * 60 seconds), используйте:
=RoundTime([МоеПолеДатаВремя], 1800)
Заключение
Для более детального технического объяснения теории округления в целом, см. статью Клайва Максфилда (Clive Maxfield) An introduction to different rounding algorithms.
Как округлить в MS Access, VBA
Какой лучший способ округлить в доступе VBA?
Мой текущий метод использует метод Excel
Но я ищу средство, которое не полагается на Excel.
12 Ответов
Будьте осторожны, функция VBA Round использует округление банкира, где она округляет .5 до четного числа, например:
В то время как функция листа Excel округляет, всегда округляет .5 вверх.
Я провел несколько тестов, и похоже, что .5 up rounding (симметричное округление) также используется для форматирования ячеек, а также для округления ширины столбца (при использовании общего числового формата). Флаг ‘Precision as displayed’, по-видимому, не делает никакого округления сам по себе, он просто использует округленный результат формата ячейки.
Я попытался реализовать функцию SymArith от Microsoft в VBA для моего округления, но обнаружил, что исправление имеет ошибку, когда вы пытаетесь дать ему число, подобное 58.55; функция дает результат 58.5 вместо 58.6. Затем я наконец обнаружил, что вы можете использовать функцию Excel Worksheet Round, например:
Application.Round(58.55, 1)
Это позволит вам сделать обычное округление в VBA, хотя это может быть не так быстро, как некоторые пользовательские функции. Я понимаю, что это был полный круг от вопроса, но хотел включить его для полноты картины.
Чтобы немного расширить принятый ответ:
«Круглая функция выполняет круг до четности, которая отличается от круглой до большей.»
—Microsoft
Формат всегда округляется.
ACC2000: ошибки округления при использовании чисел с плавающей запятой: http://support.microsoft.com/kb/210423
ACC2000: как округлить число вверх или вниз на желаемое приращение: http://support.microsoft.com/kb/209996
Как Реализовать Пользовательские Процедуры Округления: http://support.microsoft.com/kb/196652
В Швейцарии и, в частности, в страховой отрасли, мы должны использовать несколько правил округления, в зависимости от того, если это чэш, выгода и т.д.
В настоящее время я использую эту функцию
который, кажется, работает нормально
и поэтому on.You’ll часто обнаруживают, что, по-видимому, такие решения kludgy намного быстрее, чем использование функций Excel, потому что VBA, похоже, работает в другом пространстве памяти.
например If A > B Then MaxAB = A Else MaxAB = B примерно в 40 раз быстрее, чем при использовании ExcelWorksheetFunction.Max
Int и Fix-это полезные функции округления, которые дают вам целочисленную часть числа.
Int всегда округляется вниз — Int (3.5) = 3, Int(-3.5) = -4
Fix всегда округляется в сторону нуля-Fix(3.5) = 3, Fix(-3.5) = -3
Есть также функции принуждения, в частности CInt и CLng, которые пытаются принудить число к целочисленному типу или длинному типу (целые числа находятся между -32,768 и 32,767, длинные-между -2,147,483,648 и 2,147,483,647). Они оба будут округляться в направлении ближайшего целого числа, округляя от нуля от .5 — CInt (3.5) = 4, Cint(3.49) = 3, CInt(-3.5) = -4, и т.д.
К сожалению, собственные функции VBA, которые могут выполнять округление, либо отсутствуют, ограничены, неточны или ошибочны, и каждый из них обращается только к одному методу округления. Плюс в том, что они быстры, и это может быть в некоторых ситуациях важно.
Однако зачастую точность является обязательной, и при сегодняшней скорости работы компьютеров чуть более медленная обработка вряд ли будет замечена, да и вообще не для обработки единичных значений. Все функции в приведенных ниже ссылках работают со скоростью около 1 мкс.
Полный набор функций — для всех распространенных методов округления, для всех типов данных VBA, для любого значения и не возвращающих неожиданные значения — можно найти здесь:
Код только на GitHub:
Они охватывают обычные методы округления:
Округление вниз, с возможностью округления отрицательных значений до нуля
Округление вверх, с возможностью округления отрицательных значений от нуля
Округление на 4/5, либо от нуля, либо до четного (округление банкира)
Круг число значащих цифр
Первые три функции принимают все числовые типы данных, в то время как последняя существует в трех разновидностях — для валюты, десятичной и двойной соответственно.
Все они принимают определенное количество десятичных знаков , включая отрицательное число, которое округляется до десятков, сотен и т. д. Те с вариант в качестве возвращаемого типа вернется Null за непонятную вход
Тестовый модуль для тестирования и проверки также включен.
Пример здесь — для общего округления 4/5. Пожалуйста, изучите встроенные комментарии для тонких деталей и способ CDec используется, чтобы избежать битовых ошибок.
Лэнс уже упоминал о наследовании округления bug в реализации VBA. Поэтому мне нужна реальная функция округления в приложении VB6. Вот один из них, который я использую. Он основан на том, что я нашел в интернете, как указано в комментариях.
Если вы говорите о округлении до целого числа (а не до n десятичных знаков), всегда есть старый школьный способ:
(Вы можете сделать эту работу для n десятичных знаков тоже, но она начинает немного запутываться)
Вот простой способ всегда округлять до следующего целого числа в Access 2003:
- [Weight] = 5.33; Int ([Weight]) = 5 ; so 5.33-5 = 0.33 (<>0), поэтому ответ будет BillWt = 5+1 = 6.
- [Вес] = 6.000, Инт([вес]) = 6 , так 6.000-6 = 0, поэтому ответ BillWt = 6.
Я использовал следующую простую функцию для округления своих валют , как в нашей компании мы всегда округляем.
но это будет ALWAYS округлить до 2 десятичных знаков и также может привести к ошибке.
даже если он отрицательный, он округлится (-1.011 будет -1.01, а 1.011 будет 1.02)
таким образом, чтобы предоставить больше возможностей для округления вверх (или вниз для отрицательных значений) , вы можете использовать эту функцию:
(используется в модуле, если это не очевидно)
Чтобы решить проблему разбиения пенни, не суммирующуюся с суммой, из которой они были первоначально разделены, я создал пользовательскую функцию.
Похожие вопросы:
Мне определенно нравится MS Access как RAD-инструмент для небольших приложений, управляемых данными. Но одна вещь, которую мне действительно не хватает как .Net-разработчику, — это регулярные.
Как я могу выполнить запрос для возврата записей в базе данных ms-access с использованием кода VBA?
Как я могу создать процесс, работающий в отдельном потоке в MS Access VBA? Я хотел бы создать процесс, который будет просто сидеть и ждать сообщения.
У нас есть большой проект MS Access, который требует функциональности GUI, что трудно / невозможно сделать в среде форм VBA / access. Со временем мы хотим переписать/перенести в управляемую среду C#.
Как выполнить сохраненный запрос в MS Access 2007 в VBA? Я не хочу копировать и вставлять SQL в VBA. Я скорее просто выполняю имя запроса. Это не сработает . VBA не удается найти запрос.
Я использую следующий код VBA для полей со списком в форме MS Access Private Sub ComboEmployee_AfterUpdate() Dim myFilter As String myFilter = Select * from Filter_Employee where ([LastName] = iif(‘.
Как я могу связать таблицу из одной базы данных MS Access (*.МБР или *.accdb) к другой базе данных Access в VBA? В основном я просто должен был использовать VBA для репликации того, что делает.
Мне нравится индексировать содержимое (таблицы) и код (VBA, просмотр запросов) нескольких файлов MS Access, предпочтительно на машине, на которой не установлен MS Access. Я использовал.
Как я могу отправить email через учетную запись, используя MS Access VBA? Я знаю, что этот вопрос туманен, но так трудно найти соответствующую информацию в интернете, которая не устарела в некотором.
Я новичок в MS Access и хотел бы ввести EmployeeID в текстовое поле 1 (text_in), и после нажатия кнопки запрос результата (одно уникальное значение, например, имя сотрудника, взятое из таблицы).
Как округлить в MS Access, VBA
Какой лучший способ округлить в VBA Access?
Мой текущий метод использует метод Excel
Но я ищу средство, которое не зависит от Excel.
12 ответов
Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.
Будьте внимательны, функция округления VBA использует округление Банкира, где оно округляет .5 до четного числа, например так:
Принимая во внимание, что Функция Excel Worksheet Round, всегда округляет .5 вверх.
Я провел несколько тестов, и похоже, что округление до .5 (симметричное округление) также используется для форматирования ячеек, а также для округления ширины столбца (при использовании формата общего числа). Флаг «Точность как отображается», по-видимому, не выполняет никакого округления, он просто использует округленный результат формата ячейки.
Я попытался реализовать функцию SymArith от Microsoft в VBA для моего округления, но обнаружил, что Fix имеет ошибку, когда вы пытаетесь присвоить ей число, например 58.55; функция, дающая результат 58,5 вместо 58,6. Затем я наконец обнаружил, что вы можете использовать функцию Excel Worksheet Round, например:
Приложение. Раунд (58,55, 1)
Это позволит вам выполнять обычное округление в VBA, хотя это может быть не так быстро, как некоторые пользовательские функции. Я понимаю, что это полный круг вопроса, но хотел бы включить его для полноты.
Чтобы немного расширить принятый ответ:
««Функция Round выполняет округление до четности, которое отличается от округления к большему».
—Microsoft
Формат всегда округляется.
ACC2000: ошибки округления при использовании чисел с плавающей запятой: http://support.microsoft.com/kb/210423
ACC2000: Как округлить число вверх или вниз с желаемым приращением: http://support.microsoft.com/kb/209996
Как реализовать пользовательские процедуры округления: http://support.microsoft.com/kb/196652
В Швейцарии и, в частности, в сфере страхования, мы должны использовать несколько правил округления, в зависимости от того, выплачиваются ли они пособия и т.д.
Я в настоящее время использую функцию
который, кажется, работает нормально
и т. д. Вы часто обнаруживаете, что подобные грязные решения намного быстрее, чем использование функций Excel, потому что VBA работает в другом пространстве памяти.
например If A > B Then MaxAB = A Else MaxAB = B примерно в 40 раз быстрее, чем с помощью ExcelWorksheetFunction.Max
Int и Fix являются полезными функциями округления, которые дают целую часть числа.
Int всегда округляется — Int (3.5) = 3, Int (-3.5) = -4
Фикс всегда округляет до нуля — Фикс (3.5) = 3, Фикс (-3.5) = -3
Есть также функции принуждения, в частности CInt и CLng, которые пытаются привести число к целочисленному типу или длинному типу (целые числа находятся в диапазоне от -32 768 до 32 767, длинные — от-2 147 483 648 до 2 147 483 647). Они оба будут округляться до ближайшего целого числа, округляясь от нуля от .5 — CInt (3.5) = 4, Cint (3.49) = 3, CInt (-3.5) = -4 и т.д.
К сожалению, встроенные функции VBA, которые могут выполнять округление, отсутствуют, ограничены, неточны или содержат ошибки, и каждая из них касается только одного метода округления. Плюс в том, что они быстрые, и это может быть важно в некоторых ситуациях.
Тем не менее, часто точность является обязательной, и при сегодняшней скорости компьютеров едва ли можно заметить немного более медленную обработку, даже не для обработки отдельных значений. Все функции по ссылкам ниже работают примерно за 1 мкс.
Полный набор функций — для всех распространенных методов округления, для всех типов данных VBA, для любого значения и без возврата неожиданных значений — можно найти здесь:
Код только на GitHub:
Они охватывают обычные методы округления:
Округление вниз с возможностью округления отрицательных значений до нуля
Округление с возможностью округления отрицательных значений от нуля
Округление до 4/5, либо от нуля до четного (округление банкира)
Округлить до количества значащих цифр
Первые три функции принимают все числовые типы данных, а последняя существует в трех вариантах — для валюты, десятичной и двойной соответственно.
Все они принимают указанное количество десятичных знаков, включая отрицательное число, которое округляется до десятков, сотен и т.д. Те, у которых в качестве типа возврата указан вариант, вернут Null для непонятного ввода
Тестовый модуль для тестирования и проверки также включен.
Пример здесь — для общего округления 4/5. Пожалуйста, изучите встроенные комментарии для тонких деталей и того, как CDec используется, чтобы избежать битовых ошибок.
Если вы говорите о округлении до целочисленного значения (а не о округлении до n десятичных знаков), всегда есть старый способ:
(Вы можете сделать это для n знаков после запятой, но это становится немного грязным)
Ланс уже упоминал о округлении наследования bug в реализации VBA. Поэтому мне нужна реальная функция округления в приложении VB6. Вот тот, который я использую. Он основан на том, что я нашел в Интернете, как указано в комментариях.
Чтобы решить проблему разбивки пенни, не добавляя к сумме, из которой они были первоначально разбиты, я создал пользовательскую функцию.
Вот простой способ всегда округлять до следующего целого числа в Access 2003:
- [Вес] = 5,33; Int ([Вес]) = 5; поэтому 5,33-5 = 0,33 (& lt;> 0), поэтому ответом является BillWt = 5 + 1 = 6.
- [Вес] = 6.000, Int ([Вес]) = 6, поэтому 6.000-6 = 0, поэтому ответ BillWt = 6.
Я использовал следующую простую функцию для округления своих валют, так как в нашей компании мы всегда округляем.
но это ВСЕГДА округлит до 2 десятичных знаков и может также привести к ошибке.
даже если оно отрицательное, оно округляется вверх (-1.011 будет -1.01, а 1.011 будет 1.02)
поэтому, чтобы предоставить больше опций для округления в большую или меньшую сторону, вы можете использовать эту функцию:
(используется в модуле, если это не очевидно)
MS Access: Round Function
This MSAccess tutorial explains how to use the Access Round function with syntax and examples.
Description
The Microsoft Access Round function returns a number rounded to a specified number of decimal places. However, the Round function behaves a little peculiar and uses something commonly referred to as bankers rounding. So before using this function, please read the following:
The Round function utilizes round-to-even logic. If the expression that you are rounding ends with a 5, the Round function will round the expression so that the last digit is an even number.
In these cases, the last digit after rounding is always an even number. So, be sure to only use the Round function if this is your desired result.
Syntax
The syntax for the Round function in MS Access is:
Parameters or Arguments
Applies To
The Round function can be used in the following versions of Microsoft Access:
- Access 2016, Access 2013, Access 2010, Access 2007, Access 2003, Access XP, Access 2000
Example
Let’s look at how to use the Round function in MS Access:
Example in VBA Code
The Round function can be used in VBA code in Microsoft Access.
In this example, the variable called LNumber would now contain the value of 210.7.
Example in SQL/Queries
You can also use the Round function in a query in Microsoft Access.
In this query, we have used the Round function as follows:
This query will return the UnitPrice rounded to 1 decimal place and display the results in a column called Expr1. You can replace Expr1 with a column name that is more meaningful.
The results would now be displayed in a column called RoundedValue.
Tip to Avoid Bankers Rounding:
If you want to avoid bankers rounding, you can create your own custom function as follows:
And then call the StandardRound function instead of using the Round function.
Frequently Asked Questions
Question: I read your explanation of the Round function using the round-to-even logic. However, I really need to round some values in the traditional sense (where 5 always rounds up). How can I do this?
Answer: You could always use the following logic:
If you wanted to round 12.65 to 1 decimal place in the traditional sense (where 12.65 rounded to 1 decimal place is 12.7, instead of 12.6), try adding 0.000001 to your number before applying the Round function:
By adding the 0.000001, the expression that you are rounding will end in 1, instead of 5. causing the Round function to round in the traditional way.
And the 0.000001 does not significantly affect the value of your expression so you shouldn’t introduce any calculation errors.
ЗАОСТРИМ НА ОКРУГЛЕНИИ
По итогам некоторой работы решил наваять небольшую статью по поводу разных методов округлений и их реализаций в PHP, Excel, OpenOffice. Думаю, эта информация может пригодиться кому-то еще 🙂
Методы округления в Excel, PHP и не только
Введение
При решении задач мат.моделирования и автоматизации бизнес-процессов очень часто возникают погрешности результата, связанные с неочевидностью выбора способов округления, используемых при написании кода.
Так, заказчик почти никогда не может явно сформулировать требования к применяемым в расчетах способам округления, и, зачастую, просто использует расчет, выполненный в Excel-е, как эталон, не задумываясь, как именно и почему именно так происходит округление в том или ином случае.
В такой ситуации полезно:
- точно представлять существующие стандартные методы округления,
- уметь по расчету Excel или другому расчету определять использованные в нем методы округления,
- уметь воспроизводить желаемый способ округления средствами языка, используемого для разработки.
В данной статье мы расскажем о стандартных способах округления, проанализируем пакет MS Excel 2003, пакет OpenOffice Calc 2.3.0 и язык PHP на предмет имеющихся в них функций округления и их соответствия стандартным. Попутно будут предложены примеры реализаций недостающих функций.
Виды округлений
Стандарт IEEE 754 описывает семь методов округления чисел:
- round-down — усечение, округление по направлению к нулю,
- round-half-up — арифметическое округление (если отбрасываемые цифры больше либо равны 0.5, происходит округление вверх (от нуля), иначе цифры просто отбрасываются),
- round-half-even — банковское округление, (если отбрасываемые цифры больше 0.5, происходит округление вверх (от нуля), если меньше 0.5 — цифры отбрасываются, если отбрасываемая часть равна 0.5, то округление происходит в зависимости от четности предпоследней цифры),
- round-ceiling — округление к плюс бесконечности,
- round-floor — округление к минус бесконечности,
- round-half-down — подобно арифметическому (round-half-up), пятерка округляется вниз,
- round-up — округление от нуля.
Первые пять методов являются, согласно стандарту, обязательными к реализации, а последние два — опциональными.
Тестовая выборка, однозначно различающая методы
Для определения соответствия функции, реализующей округление, некоторому стандартному методу округления удобно воспользоваться специальной тестовой выборкой чисел. Предлагаемый набор из 4 чисел позволяет однозначно различить перечисленные в стандарте семь методов округления.
Рассмотрим следующую таблицу (в предположении, что округления производились до 1 знака после запятой):
Тип округления 0.35 -0.25 -0.41 -0.59 round_down 0,3–0,2–0,4–0,5 round_up 0,4–0,3–0,5–0,6 round_half_up 0,4–0,3–0,4–0,6 round_half_even 0,4–0,2–0,4–0,6 round_ceiling 0,4–0,2–0,4–0,5 round_floor 0,3–0,3–0,5–0,6 round_half_down 0,3–0,2–0,4–0,6
Не будем проводить доказательства того, что набор из 4 чисел является минимальным для решения задачи различения методов, покажем лишь, что в данном конкретном наборе нельзя удалить ни одно из чисел:
- При удалении числа 0.35 методы round_half_even и round_half_down.
- При удалении числа -0.25 методы round_half_up и round_half_even.
- При удалении числа -0.41 методы round_up и round_half_up.
- При удалении числа -0.59 методы round_half_even и round_ceiling.
Отметим, что данный набор чисел не может использоваться для доказательства корректности той или иной функции округления, а только для определения её типа и только в том случае, если заранее известно, что функция реализует один из 7 вышеописанных методов округления.
Анализ существующих функций округления в MS Excel 2003
Изучение и понимание отличий функций округления, доступных в MS Excel, представляется нам важной задачей, т.к. большинство расчетных прототипов, входящих в ТЗ на задачи автоматизации и моделирования, реализуются именно средствами MS Office. При этом важно понимать, что проверка корректности выполнения ТЗ обычно производится путем сверки результатов с результатами прототипа. Таким образом, умение воспроизводить результаты работы методов округления, используемых в каждом конкретном случае, является необходимыми для получения адекватных расчетных результатов.
Анализ справочника функций MS Office Excel 2003 позволяет составить следующий список стандартных функций, реализующих различные виды округления: ОКРУГЛ, ОКРВВЕРХ, ОКРВНИЗ, ОКРУГЛВВЕРХ, ОКРУГЛВНИЗ, ОТБР, ЦЕЛОЕ.
Функция 0.35 -0.25 -0.41 -0.59 Результат анализа ОКРУГЛ 0.4–0.3–0.4–0.6совпадает с round_half_up ОКРВВЕРХ 0.4–0.3–0.5–0.6совпадает с round_up ОКРВНИЗ 0.3–0.2–0.4–0.5совпадает с round_down ОКРУГЛВВЕРХ 0.4–0.3–0.5–0.6совпадает с round_up ОКРУГЛВНИЗ 0.3–0.2–0.4–0.5совпадает с round_down ОТБР 0.3–0.2–0.4–0.5совпадает с round_down ЦЕЛОЕ 0–1–1–1не позволяет использовать точность. ЦЕЛОЕ(X*10)/10 0.3–0.3–0.5–0.6совпадает с round_floor
Таким образом, получаем следующие различные наборы функций:
- ОКРУГЛ использует метод round_half_up,
- ОКРВВЕРХ, ОКРУГЛВВЕРХ используют round_up (различаются способом указания аргументов),
- ОКРВНИЗ, ОКРУГЛВНИЗ, ОТБР используют round_down (различаются способом указания аргументов),
- ЦЕЛОЕ использует round_floor, но не позволяет использовать точность.
Следовательно, пользователям MS Excel доступны 4 из 7 рассматриваемых методов округления:
- round_up (округление от нуля),
- round_down (округление к нулю)
- round_half_up (арифметическое округление),
- round_floor (округление к минус бесконечности).
Реализация недостающих методов округления в MS Excel 2003
Для реализации недостающих методов округления нам потребуется математическая функция sgn (signum). В языке формул MS Excel она реализована функцией ЗНАК.
Итак, опишем на псевдокоде, близком к языку формул MS Excel, формулы, позволяющие получить желаемые методы округления.
ROUND_CEILING (X,D) = ЕСЛИ(ЗНАК(X)>0;ОКРУГЛВВЕРХ(X;D);ОКРУГЛВНИЗ(X;D))
ROUND_FLOOR (X,D) = ЕСЛИ(ЗНАК(X) 0?1:-1):0;
>
Т еперь, имея p_ceil, p_floor и round (как реализации, соответственно, round_ceiling, round_floor и round_half_up) и собственную реализацию sgn, мы можем воспроизвести недостающие методы округления следующим образом:
function round_down($num, $d = 0)
<
// подтасовкой знака меняем направление округления
// с минус бесконечности на ноль
return sgn($num)*p_floor(abs($num), $d);
>
function round_up($num, $d = 0)
<
// подтасовкой знака меняем направление округления
// с плюс бесконечности на
return sgn($num)*p_ceil(abs($num), $d);
>
function round_half_down($num, $d = 0)
<
// Если последняя цифра > 5
// то округляем вверх
// иначе округляем вниз
return((2*round_up($num,$d)==round_up(2*$num,$d))
? round($num,$d)
: round_down($num,$d) );
>
function round_half_even($num, $d = 0)
<
// Если округляемая цифра !=5, то
// всё ясно, округление стандартное
if( round($num,$d) == round_half_down($num,$d) )
return round($num,$d);
// Получаем предпоследнюю цифру
$pre_digit = round_down( $num, $d );
// Если она четная
if( ($pre_digit/2) == round_down($pre_digit/2,$d) )
// то округляем вниз
return round_down($num, $d);
else
// иначе округляем вверх
return round_up($num, $d);
>
Данный код не является единственным или наилучшим способом реализации указанных методов округления, а являются лишь иллюстрацией возможности их реализации через имеющиеся стандартные функции PHP.
Полезные ссылки по теме