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.
For example:
Round (12.55, 1)
Result: 12.6 (rounds up) Round (12.65, 1)
Result: 12.6 (rounds down) Round (12.75, 1)
Result: 12.8 (rounds up)
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:
Round ( expression, [ decimal_places ] )
Parameters or Arguments
expression A numeric expression that is to be rounded. decimal_places Optional. It is the number of decimal places to round the expression to. If this parameter is omitted, then the Round function will return an integer.
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:
Round (210.67, 1)
Result: 210.7 Round (210.67, 0)
Result: 211 Round (210.67)
Result: 211
Example in VBA Code
The Round function can be used in VBA code in Microsoft Access.
For example:
Dim LNumber As Double
LNumber = Round (210.67, 1)
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.
For example:
In this query, we have used the Round function as follows:
Expr1: Round([UnitPrice],1)
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.
For example:
RoundedValue: Round([UnitPrice],1)
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:
' This function overcomes the bankers Rounding that occurs in the
' built-in VBA Round function to provide true (symmetric) numeric Rounding
' Created by TechOnTheNet.com
Public Function StandardRound(pValue As Double, pDecimalPlaces As Integer) As Variant
Dim LValue As String
Dim LPos As Integer
Dim LNumDecimals As Long
Dim LDecimalSymbol As String
Dim QValue As Double
' Return an error if the decimal places provided is negative
If pDecimalPlaces < 0 Then
StandardRound = CVErr(2001)
Exit Function
End If
' If your country uses a different symbol than the "." to denote a decimal
' then change the following LDecimalSymbol variable to that character
LDecimalSymbol = "."
' Determine the number of decimal places in the value provided using
' the length of the value and the position of the decimal symbol
LValue = CStr(pValue)
LPos = InStr(LValue, LDecimalSymbol)
LNumDecimals = Len(LValue) - LPos
' Round if the value provided has decimals and the number of decimals
' is greater than the number of decimal places we are rounding to
If (LPos > 0) And (LNumDecimals > 0) And (LNumDecimals > pDecimalPlaces) Then
' Calculate the factor to add
QValue = (1 / (10 ^ (LNumDecimals + 1)))
' Symmetric rounding is commonly desired so if the value is
' negative, make the factor negative
' (Remove the following 3 lines if you require «Round Up» rounding)
If (pValue < 0) Then
QValue = -QValue
End If
' Add a 1 to the end of the value (For example, if pValue is 12.65
' then we will use 12.651 when rounding)
StandardRound = Round(pValue + QValue, pDecimalPlaces)
' Otherwise return the original value
Else
StandardRound = pValue
End If
End Function
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:
Round(12.45+0.000001,1)
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.
Источник: https://www.techonthenet.com/access/functions/numeric/round.php
Как округлить в MS Access, VBA
каков наилучший способ округления в доступе VBA?
мой текущий метод использует метод Excel
Excel.WorksheetFunction.Round(…
но я ищу средство, которое не полагается на Excel.
rounding excel ms-access worksheet-function access-vba
будьте осторожны, функция VBA Round использует округление банкира, где она округляется .5 до четного числа, например:
Round (12.55, 1) would return 12.6 (rounds up)
Round (12.65, 1) would return 12.6 (rounds down)
Round (12.75, 1) would return 12.8 (rounds up)
в то время как функция листа Excel круглый, всегда округляет .5 вверх.
Я сделал несколько тестов, и похоже .5 округление вверх (симметричное округление) также используется при форматировании ячеек, а также для округления ширины столбца (при использовании общего формата чисел). Флаг «точность как показано», похоже, не делает никакого округления, он просто использует округленный результат формата ячейки.
Я попытался реализовать функцию SymArith от Microsoft в VBA для моего округления, но обнаружил, что исправление имеет ошибку, когда вы пытаетесь дать ему число, подобное 58.55; функция дает результат 58.5 вместо 58.6. Затем я, наконец, обнаружил, что вы можете использовать круглую функцию листа Excel, например:
приложение.Круглый(58.55, 1)
Это позволит вам сделать нормальный округление в VBA, хотя это может быть не так быстро, как некоторые пользовательские функции. Я понимаю, что из этого вопроса вышел полный круг, но хотел включить его для полноты.
в Швейцарии и, в частности, в страховой отрасли, мы должны использовать несколько правил округления, в зависимости от того, если это чеш, выгода и т. д.
в настоящее время я использую функцию
Function roundit(value As Double, precision As Double) As Double
roundit = Int(value / precision + 0.5) * precision
End Function
который, кажется, работает хорошо
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 и т. д.
1 place = INT(number x 10 + .5)/10
3 places = INT(number x 1000 + .5)/1000
и так далее.Вы часто обнаружите, что, по-видимому, такие решения kludgy намного быстрее, чем использование функций Excel, потому что VBA, похоже, работает в другом пространстве памяти.
например If A > B Then MaxAB = A Else MaxAB = B примерно на 40 x быстрее, чем с помощью ExcelWorksheetFunction.Макс!—3—>
к сожалению, собственные функции VBA, которые могут выполнять округление, либо отсутствуют, ограничены, неточны или ошибочны, и каждый обращается только к одному методу округления. Плюс в том, что они быстрые, и это может быть важно в некоторых ситуациях.
однако часто точность является обязательной, и со скоростью компьютеров сегодня немного медленная обработка вряд ли будет замечена, действительно, не для обработки отдельных значений. Все функции в приведенных ниже ссылках выполняются по адресу около 1 мкс.
- полный набор функций — для всех распространенных методов округления, всех типов данных VBA, для любого значения и не возвращающих неожиданных значений-можно найти здесь:
- округление значений вверх, вниз, на 4/5 или до значимых цифр (EE)
- или здесь:
- округление значений вверх, вниз, на 4/5 или до значимых цифр (CodePlex)
- код только в GitHub:
- VBA.Раунд
- они охватывают обычные методы округления:
- округлить вниз, с возможностью округления отрицательных значений до нуля
- округлить, с возможностью округления отрицательных значений от нуля
- раунд на 4/5, либо от нуля или до четного (округление банкира)
- округлить до числа значимых цифры
первые три функции принимают все числовые типы данных, в то время как последний существует в трех разновидностях — для валюты, десятичной и двойной соответственно.
все они принимают заданное количество десятичных знаков, включая отрицательное число, которое округляется до десятков, сотен и т. д. Те, у кого Variant как тип возврата, вернут Null для непонятного ввода
модуль теста Для теста и проверки включен как что ж.
пример здесь-для общего округления 4/5. Пожалуйста, изучите комментарии в строке для тонких деталей и пути CDEC и используется, чтобы избежать ошибок.
Источник: https://askdev.ru/q/kak-okruglit-v-ms-access-vba-271988/
Округление в Аксессе
Автор Allen Browne, декабрь 2007. Обновлено: август 2008.
Оригинал Rounding in 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)
Public Function RoundTime(varTime As Variant, Optional ByVal lngSeconds As Long = 900&) As Variant Dim lngSecondsOffset As Long RoundTime = Null If Not IsError(varTime) Then If IsDate(varTime) Then If (lngSeconds < 1&) Or (lngSeconds > 86400) Then lngSeconds = 1& End If lngSecondsOffset = lngSeconds * CLng(DateDiff(«s», #12:00:00 AM#, TimeValue(varTime)) / lngSeconds) RoundTime = DateAdd(«s», lngSecondsOffset, DateValue(varTime)) End If End If
End Function
Заключение
Для более детального технического объяснения теории округления в целом, см. статью Клайва Максфилда (Clive Maxfield) An introduction to different rounding algorithms.
Источник: http://alx-artamonov.narod.ru/index/0-7
Как сделать округление в access?
lame 6 (13635)3619 5 лет
Так как и везде не обязательно в именно Access, просто запомни, что для цифр существует целый тип данных и вещественных, целый не может хранить дробную часть и она будет округляться, конкретно что у Doctor_ на скрине Byte,Integer, Long Integer — это целые типы данных разница в них только в том что под эти типа выделяется разное количество памяти, byte только хранит числа от 0…255 больше не может, Integer уже до 32767, а другой еще больше, к вещественным типам относится Single, Double,(под Single выделяется меньше памяти, под Double, больше) другие там уже для других целей(только скрин описываю, на самом деле этих типов гораздо больше). Не какой магии.
Здравствуйте, уважаемые читатели.
До Access 2002 (или 2000) встроенной функции округления не было. Поэтому все пользовались самописными. Потом появилась функция Round(). Тут можно было вдохнуть с облегчением и избавится от собственной.
Как-то заказчик прислал мне скриншот с неправильными расчетами. Анализ кода показал, что функция Round() дала сбой и округляла следующим образом (проверял в окне отладки):9.5 =10 8.5 = 8 7.5 = 8 6.5 = 6 5.5 = 6 4.5 = 4 3.5 = 4 2.5 = 2 1.5 = 2
0.5 = 0
Разбираться было лень. В результате заменил на собственное творение, т.к. это деньги:
Public Function CM_Okrugl(ByVal dbl As Double) As Long ' округляет число dbl до целого Dim lng As Long lng = Fix(dbl) If (dbl — lng) До встречи! (с) Скоков Сергей
Существует ряд задач, для решения которых нет необходимости оперировать с большим количеством знаков после запятой. В частности, для работы с денежными единицами достаточно двух десятичных разрядов.
В таком случае в определенных операциях (как промежуточных, так и производящих итоговые вычисления) необходимо выполнить округление результатов. Это может быть округление как до второго десятичного знака (скажем, до копеек, центов и т. д.), так и до целых значений.
С этой целью используется функция округления, которая вводится посредством диалогового окна Мастер функций.
Рис. 2.28. Панель функции ОКРУГЛ
Данная функция округляет число до указанного количества десятичных разрядов. Синтаксис ее следующий:
ОКРУГЛ(число; количество_цифр)
здесь число — это округляемое число, количество_цифр — это количество десятичных разрядов, до которого нужно округлить число.
Например, для операции извлечения корня в нашем примере формула округления будет иметь такой вид:
=ОКРУГЛ(В10/(1/С10);2)
Первый аргумент, В10/(1/С10), показывает, для какой операции выполняется округление, а второй (цифра 2) определяет количество десятичных разрядов. В нашем случае вычисления осуществляются с точностью до второго знака после запятой (например, до копеек). Однако округление необходимо производить на определенном этапе расчетов.
ПРИМЕР
На таможню приходит товар стоимостью 3 цента за единицу в количестве 1000 штук. Курс обмена — 29,31 руб./$, а все таможенные платежи (без учета НДС) составляют 29,45%. База начисления для таможенных платежей будет равна цене в долларах, умноженной на курс доллара и количество единиц товара: $0,03 * 29,31 * 1000 = 879,30 руб.
При умножении базы начисления на ставку таможенного сбора получается сумма, которой быть не может (так как не существует пока в мире десятых и сотых долей копеек при перечислении их через банк): 879,30 руб. * 29,45% = 258,9539 руб.
Если и далее производить расчеты без округления размера таможенного платежа, то можно получить стоимость партии товара, которая равна стоимости товара плюс таможенные платежи: 879,30 руб. + 258,9539 руб. = 1138,25385 руб.
Таким образом, цена единицы товара будет следующей: 1138,25385 руб. : 1000 шт. = 1,138254 руб.
Полученные неправильные результаты представлены в табл. 2.1.
0,03 | 1000 | 29,31 | 29,45% | 258,9539 | 1138,25385 | 1,138254 |
Таблица 2.1. Пример неправильного расчета таможенных платежей
Поэтому некоторые значения следует округлить с точностью до копеек. А сумма таможенного платежа должна вычисляться по формуле:
=ОКРУГЛ(цена в долларах х на курс доллара х количество;2)
Цифра 2 означает, что выполняется округление с точностью до второго знака (то есть до копеек).
Таким же образом можно округлить и стоимость партии товара, в результате чего получится сумма, равная 1138,25 руб. Однако операция округления цены за единицу товара может привести к нежелательным последствиям. Это зависит от того, как происходит расчет цены. Если округлить цену товара до копеек, исходя из стоимости партии товара:
=ОКРУГЛ(1138,25/1000;2)
то результат будет равен 1,14 руб. Но получается парадокс: произведя обратный расчет, мы получим, что партия стоит 1,14 * 1000 =1140 руб. Откуда-то взялись лишние 2 рубля.
Эти 2 рубля могут значительно усложнить ведение бухгалтерского учета, если в бухгалтерской программе не предусмотрена возможность задания разрядности денежной единицы при некоторых операциях.
До какого же знака целесообразно задать точность в данном примере?
В нашем случае точность округления должна быть равна разрядности копеек (2 знака после запятой) плюс разрядность числа, определяющего объем партии (у нас 3 разряда). Таким образом, необходимо округление до пятого знака.
0,03 | 1000 | 29,31 | 29,45% | 258,95 | 1138,25 | 1,13825 |
Таблица 2.2. Пример правильного расчета таможенных платежей и стоимости товара
В Excel существует более 10 функций округления, каждая из которых выполняет эту операцию по-своему. Часть из них представлена на рис. 2.29. Исчерпывающую информацию относительно всех этих функций вы можете получить в справке Excel, вызываемой путем нажатия функциональной клавиши .
Рис. 2.29. Функции округления в Excel
Источник: http://word-office.ru/kak-sdelat-okruglenie-v-access.html
Округление Accessa
Всем привет!!! Помогите уже незнаю что делать, есть база в аксесе 2003, доступ к ней осуществляю через делфи, так вот есть в БД поле с плавающей запятой, когда ввожу 0,13 она выдаёт 0,12999898755 и дополнительную чепуху в таком роде, как сделать так чтобы при в воде дробных чисел оно таким и оставалась например ввожу 5,36 оно и останется 5,36, а не 5,35998889989
в аксесе все типы перепробывал фиксированные, с числом десятичных знаков ничего непомает. Experimentator сказал(а): Всем привет!!! Помогите уже незнаю что делать, есть база в аксесе 2003, доступ к ней осуществляю через делфи, так вот есть в БД поле с плавающей запятой, когда ввожу 0,13 она выдаёт 0,12999898755 и дополнительную чепуху в таком роде, как сделать так чтобы при в воде дробных чисел оно таким и оставалась например ввожу 5,36 оно и останется 5,36, а не 5,35998889989
в аксесе все типы перепробывал фиксированные, с числом десятичных знаков ничего непомает.
Это не бага… это фича… ну… если не нравится… можно не юзать тип FLOAT…
Выдержка из мануала:
Структурированный язык манипулирования данными SQL
Типы данных SQL
…
Типы данных SQL с плавающей точкой (дробные числа) и целые числа
Типы данных SQL Описание
TINYINT(size) Может хранить числа от -128 до 127
SMALLINT(size) Диапазон от -32 768 до 32 767
MEDIUMINT(size) Диапазон от -8 388 608 до 8 388 607
INT(size) Диапазон от -2 147 483 648 до 2 147 483 647
BIGINT(size) Диапазон от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807
FLOAT(size,d) Число с плавающей точкой небольшой точности.
DOUBLE(size,d) Число с плавающей точкой двойной точности.
DECIMAL(size,d) Дробное число, хранящееся в виде строки.
…
Ввожу действительный тип а потом нельзя запятую поставить!!! :facepalm: :facepalm: :facepalm: :facepalm: Experimentator сказал(а): :facepalm: :facepalm: :facepalm:
Ну… как Вам по проще объяснить то… Тип данных «double, с плавающей точкой» по жизни неточный тип данных, там нет какой-то точности…
Для хранения double (диапазон от –1,797*10308 до 1,797*10308) Access выделяет 8 байт памяти.
Фактически Access ничего не знает про вашу запятую… ему просто некуда ее поставит (записать, сохранить)…
вместо этого он к вашему числу (на входе) применяет некую… скажем так, формулу… в результате которой получается некое целое число…
Вот это число как раз и ложится в отведенную память.
Затем, когда вы запросом «вынимаете» это число из «хранилища», Access применяет «формулу обратного преобразования» и выдает вам результат очень похожий на исходное дробное число…
При этом «типа точность» гарантирована в пределах количества знаков после запятой, указанных в свойствах конкретного поля таблицы базы данных…
Не понятно объясняю? Спросите у гугла по словам «работа с числами с плавающей точкой» и «дискретная математика«
Варианты на тему «а что же делать то?«
Первый:
1) тип поля БД не меняем, в его свойствах выставляем (кол-во знаков после запятой = 2)
2) Перед тем как положить туда дробное число (к примеру 0,13 ), «поганим» его сами. a := 0.13;
a := a + 0.00000000000001;
Второй (если все расчеты у Вас происходят в Delphi а база Access только для запросов репорта):
1) тип поля БД меняем на Текстовый
2) Перед тем как положить туда данные, приводим дробное число к строке. Третий (если база Access только для хранения данных а выборка и отображение происходят через Delphi)
1) тип поля БД меняем на Длинное целое
2) Перед тем как положить туда данные, приводим дробное число к целому. a := 0.13;
b := Trunc(a*100);
Также можно данному полю назначить тип «Мастер подстановок» и записывать туда формулу обеспечивающую необходимую вам точность отображения данных… Но это уже вам в документацию по Access… Можно также попробовать сделать в Аксесе тип Целый с числом знаков после запятой 2 и в дельфи использовать функцию напр из едита FloatToStrF(Edtit1.Text,ffNumber,2)… Вроде как-то так…
Источник: https://codeby.net/threads/okruglenie-accessa.41997/
Как Округление в MS Access, VBA
Что лучший способ округлить в VBA Access?
Мой текущий метод использует метод Excel
Excel.WorksheetFunction.Round(…
Но я ищу означает, что не полагаться на Excel.
Будьте осторожны, функция VBA Round использует округление банкира, где она округляется .5 четному числу, например, так:
Round (12.55, 1) would return 12.6 (rounds up)
Round (12.65, 1) would return 12.6 (rounds down)
Round (12.75, 1) would return 12.8 (rounds up)
В то время как Excel Worksheet функции раунда, всегда округляет .5 вверх.
Я сделал несколько тестов, и это выглядит как 0,5 до округления (симметричное округление) также используется форматирование ячеек, а также для ширины столбца округления (при использовании формата общего числа). «Точность как на экране» флаг не появляется, чтобы сделать какой-либо округление себя, он просто использует округленный результат формата ячейки.
Я попытался реализовать функцию SymArith от Microsoft в VBA для моего скругления, но обнаружил, что Fix имеет ошибку при попытке дать ему номер, как 58,55; функция дает результат 58,5 вместо 58,6. Я, наконец, обнаружил, что вы можете использовать функцию Excel Worksheet Round, например, так:
Application.Round (58.55, 1)
Это позволит сделать нормальный округление в VBA, хотя это может быть не так быстро, как некоторые пользовательские функции. Я понимаю, что это полный круг от вопроса, но хотел, чтобы включить его для полноты картины.
Для того, чтобы решить проблему пенни расщепляется, не добавляя к сумме, которую они первоначально были отделились от, я создал определенный пользователь функцию.
Function PennySplitR(amount As Double, Optional splitRange As Variant, Optional index As Integer = 0, Optional n As Integer = 0, Optional flip As Boolean = False) As Double
' This Excel function takes either a range or an index to calculate how to «evenly» split up dollar amounts
' when each split amount must be in pennies. The amounts might vary by a penny but the total of all the
' splits will add up to the input amount.
' Splits a dollar amount up either over a range or by index
' Example for passing a range: set range $I$18:$K$21 to =PennySplitR($E$15,$I$18:$K$21) where $E$15 is the amount and $I$18:$K$21 is the range
' it is intended that the element calling this function will be in the range
' or to use an index and total items instead of a range: =PennySplitR($E$15,,index,N)
' The flip argument is to swap rows and columns in calculating the index for the element in the range.
' Thanks to: http://stackoverflow.com/questions/5559279/excel-cell-from-which-a-function-is-called for the application.caller.row hint.
Dim evenSplit As Double, spCols As Integer, spRows As Integer
If (index = 0 Or n = 0) Then
spRows = splitRange.Rows.count
spCols = splitRange.Columns.count
n = spCols * spRows
If (flip = False) Then
index = (Application.Caller.Row — splitRange.Cells.Row) * spCols + Application.Caller.Column — splitRange.Cells.Column + 1
Else
index = (Application.Caller.Column — splitRange.Cells.Column) * spRows + Application.Caller.Row — splitRange.Cells.Row + 1
End If
End If
If (n < 1) Then
PennySplitR = 0
Return
Else
evenSplit = amount / n
If (index = 1) Then
PennySplitR = Round(evenSplit, 2)
Else
PennySplitR = Round(evenSplit * index, 2) - Round(evenSplit * (index - 1), 2)
End If
End If
End Function
1 place = INT(number x 10 + .5)/10
3 places = INT(number x 1000 + .5)/1000
и так on.You'll часто обнаруживают, что, по-видимому запутано решения, как это гораздо быстрее, чем при использовании функции Excel, так как VBA, кажется, действует в другом пространстве памяти.
например , If A > B Then MaxAB = A Else MaxAB = Bоколо 40 раз быстрее , чем при использовании ExcelWorksheetFunction.Max
В Швейцарии и в particulat в страховой отрасли, мы должны использовать несколько правил округления, в зависимости от того, что chash вне, пособие и т.д.
Я в настоящее время использовать функцию
Function roundit(value As Double, precision As Double) As Double
roundit = Int(value / precision + 0.5) * precision
End Function
который, кажется, работает нормально
Int и Fix оба полезные функции округления, которые дают вам целую часть числа.
Int всегда округляет вниз — Int (3.5) = 3, Int (-3.5) = -4
Закрепить всегда округляет к нулю — FIX (3.5) = 3, Фикс (-3.5) = -3
Там также функции принуждения, в частности CInt и CLng, которые пытаются принудить число к целому типу или длинного типа (целые числа в диапазоне от -32768 до 32767, тоскует находятся между-2,147,483,648 и 2,147,483,647). Они оба будут круглый в направлении ближайшего целого числа, округление от нуля из .5 — CInt (3.5) = 4, Cint (3,49) = 3, CInt (-3.5) = -4, и т.д.
1 place = INT(number x 10 + .5)/10
3 places = INT(number x 1000 + .5)/1000
и так on.You'll часто обнаруживают, что, по-видимому запутано решения, как это гораздо быстрее, чем при использовании функции Excel, так как VBA, кажется, действует в другом пространстве памяти.
например , If A > B Then MaxAB = A Else MaxAB = Bоколо 40 раз быстрее , чем при использовании ExcelWorksheetFunction.Max
Вот простой способ всегда округлять до ближайшего целого числа в Access 2003:
BillWt = IIf([Weight]-Int([Weight])=0,[Weight],Int([Weight])+1)
Например:
- [Вес] = 5,33; Int ([Вес]) = 5; так 5.33-5 = 0,33 ( 0), так что ответ BillWt = 5 + 1 = 6.
- [Вес] = 6,000, Int ([вес]) = 6, так 6.000-6 = 0, так что ответ BillWt = 6.
Ланс уже упоминался Наследовать округление bugв реализации УВЫ. Так что я нужна реальная функция округления в приложении VB6. Вот один , который я использую. Он основан на один я нашел в Интернете , как это указано в х.
Источник: https://askvoprosy.com/voprosy/how-to-round-in-ms-access-vba
Часто задаваемый вопрос Банковское округление
Похоже,
программа Access
округляет числа неправильно. Как быть?
Вас
может удивить то, что Access
округляет число 21.985 до 21.98. Если вас
учили округлять до большего числа,
числа заканчивающиеся цифрой 5, то вы
считаете, что результат должен быть
21.99. Этот способ называют арифметическим
округлением. Программа
Access
не применяет арифметическое округление
— она выбирает банковское
округление, которое
лучше в некоторых случаях.
Разница
между арифметическим и банковским
округлением заключается в трактовке
цифры
5. Поскольку число 21.985 находится точно
в середине, между числами 21.98 и 21.99,
не просто решить, что с ним делать.
При
постоянном округлении числа с 5 на конце
до большего числа вносится систематическое
отклонение в итоги и средние значения.
Поскольку
вы округляете до большего чаще, чем до
меньшего, любые итоги или среднее,
которые
вы вычисляете, получаются чуть больше,
чем следовало бы.
Банковское
округление решает эту проблему округлением
5 в одних случаях до большего числа,
а в других до меньшего, в зависимости
от соседней четной или нечетной цифры.
Число
21.985 округляется до меньшего числа 21.98,
а число 21.995 — до большего, 22. Это не
единственный способ борьбы с систематическим
отклонением (можно решать случайным
образом, когда округлять, а когда нет),
но это общепринятая практика в
бухгалтерских
расчетах и статистике.
Вложенные функции
В
вычисляемом поле или условии отбора
можно применять несколько функций. Этот
прием известен как вложенные
функции: специальный
термин, обозначающий вставку одной
функции
внутрь другой.
Например, в программе
Access
есть встроенная функция определения
абсолютного значения числа Abs
( ), преобразующая отрицательные числа
в положительные (и
оставляющая положительные числа без
изменения).
Далее приведен пример деления
одного
поля на другое и получения в результате
заведомо положительного значения:
-
Speed: Abs
([DistanceTravelled] / [TimeTaken]) -
Если
полученный результат нужно округлить,
можно поместить целиком все выражение
внутрь
скобок функции Round
( ): - Speed: Round (Abs([DistanceTravelled] / [TimeTaken]), 2)
Вычисляя
выражение с вложенными функциями,
программа Access
сначала вычисляет результат
самой внутренней функции. В данном
примере, прежде всего, определяется
абсолютное
значение, а затем результат округляется.
В приведенном далее примере порядок
вычислений
изменен на обратный без изменения
результата:
Speed: Abs(Round([DistanceTravelled] / [TimeTaken], 2) )
Во многих случаях порядок вложения
функций имеет значение, и разный порядок
приводит к различным результатам.
Вложенные
функции быстро превращают выражение в
потенциально опасное. Даже в сравнительно
простом примере вычисления скорости
трудно предсказать результат без
пошагового
вычисления выражения.
Одна не на месте
стоящая или пропущенная скобка может
привести к сбою вычисления.
Если вы
применяете вложенные функции, не пишите
сразу выражение целиком — включайте
функции в выражение поочередно и после
вставки очередной функции выполняйте
вычисление.
Построитель
выражений
Функции
— замечательное нововведение, но в
программе Access
может оказаться слишком много
замечательных вещей. Программа предлагает
перечень из десятков различных функций,
связанных с решением разнообразных
задач, некоторые из этих функций
предназначены для выполнения
специализированных математических и
статистических вычислений.
Примечание
В этой
книге описана далеко не каждая функция
{если бы это было так, вам пришлось бы,
сидя над книгой, бороться со сном). Но в
следующих разделах вы познакомитесь с
наиболее полезными функциями для
работы с числами, тестом и датами.
Для
поиска дополнительных функций
используйте Построитель
выражений (Expression
Builder)
Если же вы предпочитаете интерактивный
режим обучения, проверьте информативный
Web-pecypc
www.techonthenet.
com/access/functions.
Для
быстрого поиска нужных вам функций
Access
предлагает компонент, именуемый
Построителем
выражений. Для
его запуска выполните следующие действия:
-
Откройте запрос в Конструкторе.
-
Щелкните правой кнопкой мыши поле, в которое вы хотите вставить выражение, и выберите команду Построить (Build).
Если
вы создаете вычисляемое поле, нужно
щелкнуть правой кнопкой мыши в ячейке
Поле,
Если
создается условие отбора, следует
щелкнуть правой кнопкой мыши в ячейке
Условие
отбора.
После
выбора командыПостроить
на
экране появляется окно Построителя
выражений, отображающее
текущее содержимое поля (рис. 7.3).
Рис.
7.3. Построитель выражений состоит
из текстового поля в верхней части окна,
в котором можно редактировать
выражение, кнопок быстрой вставки знаков
обычных операций (таких как +, -, / и *, если
почему-либо вы не можете их найти на
клавиатуре), и трехпанельного обозревателя
в нижней части окна, который поможет
найти нужные поля и функции
3. Вставьте или отредактируйте выражение.
У
Построителя
выражений есть
два ускоряющих приема работы, которые
вы, может быть,
захотите испробовать. Можно вставлять
имя без ввода с клавиатуры (рис. 7.4) и
можно
найти функцию с помощью обзора (рис.
7.5).
Примечание
Построитель
выражений
Источник: https://studfile.net/preview/5960642/page:52/
How To Fix Rounding in Access
- Rounding in Access обычно вызвано неверно настроенными системными настройками или нерегулярными записями в реестре Windows. Эта ошибка может быть исправлена специальным программным обеспечением, которое восстанавливает реестр и настраивает системные настройки для восстановления стабильности
- If you have Rounding in Access then we strongly recommend that you Download (Rounding in Access) Repair Tool.
- This article contains information that shows you how to fix Rounding in Access both (manually) and (automatically) , In addition, this article will help you troubleshoot some common error messages related to Rounding in Access that you may receive.
Примечание: Эта статья была обновлено на 2019-11-21 и ранее опубликованный под WIKI_Q210794
Rounding in Access is the error name that contains the details of the error, including why it occurred, which system component or application malfunctioned to cause this error along with some other information.
The numerical code in the error name contains data that can be deciphered by the manufacturer of the component or application that malfunctioned. The error using this code may occur in many different locations within the system, so even though it carries some details in its name, it is still difficult for a user to pinpoint and fix the error cause without specific technical knowledge or appropriate software.
Causes of Rounding in Access?
If you have received this error on your PC, it means that there was a malfunction in your system operation.
Common reasons include incorrect or failed installation or uninstallation of software that may have left invalid entries in your Windows registry, consequences of a virus or malware attack, improper system shutdown due to a power failure or another factor, someone with little technical knowledge accidentally deleting a necessary system file or registry entry, as well as a number of other causes. The immediate cause of the «Rounding in Access» error is a failure to correctly run one of its normal operations by a system or application component.
More info on Rounding in Access
РЕКОМЕНДУЕМЫЕ: Нажмите здесь, чтобы исправить ошибки Windows и оптимизировать производительность системы.
I will import it in to Access the data and a second query to Sum it up. We bill our customers and have a look at it for you. Any Ideas? Hello, you are going to need that contains the increments it returns a data mismatch.
and seconds so it appears on the customers bill as a total. the «time» data on it, not the customer data though? I get customer usage data from one in 20 second increments. I think you will need one query to round up
To make it worse, I need to convert it back to minutes info on phone calls. The data contains Can you post the excel worksheet with some of to do this in one or more queries. I cant get access to sum up the field
of our vendors in an excel spreadsheet. Округление чисел в доступе
Поэтому, если пользователь помещает в 1.23, он будет округлен до 1.2, а не будет установлен в десятичное число 1, и он округляется до следующего места. Я пытаюсь округлить десятичные знаки либо .5, либо 0 прямо сейчас, 1.
0, есть ли простой способ решить эту проблему? они могут быть полезныhttp://support.microsoft.com/?scid=…m/servicedesks/bin/kbsearch.asp?article=32378http://www.utteraccess.com/forums/access/access1503591.htmlhttp://www.mrexcel.com/archive/Formulas/31988.htmlhttp://www.mrexcel.com/archive/Formulas/10450.html Решение: Доступ к номерам округления
Ваши помощники, несомненно, будут оценены. Это простое объяснение моей проблемы, но. Привет, я отвечаю! ! ! Но тогда кто-то сказал, что поиск валюты в этом случае оказался очень полезным.
OK Я знаю, что число округления — это _ _ _ _ в Access.
Спасибо, что посмотрели, хотя я здесь, где меня ответили здесь дважды с хорошим советом. это гораздо большая база данных, чем поля 5.
Остановите, что решит все ваши проблемы. я вернусь.
Источник: https://ru.fileerrors.com/rounding-in-access.html
Функции запросов
Теперь, возможно, вам приходит в голову мысль о том, что манипулировать числами и текстом можно более искусными способами — способами, которые предоставляют гораздо больше возможностей, чем простые арифметические операции.
Вам может потребоваться округление чисел или преобразование строчных букв в прописные. Программа Access действительно предоставляет средства, называемые функциями и позволяющие поднять ваши выражения на более высокий уровень.
Функция — это реализация встроенного алгоритма, принимающая ваши данные, выполняющая вычисления и возвращающая результат.
Разница между функциями и математическими операциями, как вы уже убедились на деле, заключается в том, что функции могут выполнять более сложные действия.
У программы Access есть каталог с десятками разных функций, многие из которых реализуют такие приемы, которые вы даже не надеялись выполнить самостоятельно.
- Функции пригодятся для всех видов обработки данных в программе Access. Вы можете примять их в:
- ¦ вычисляемых полях для включения данных в результаты ваших запросов;
- ¦ условиях отбора для задания записей, отображаемых в запросе;
- ¦ коде на языке Visual Basic, многоцелевой расширяемой системе для программы Access, с которой вы познакомитесь в части V.
Изучив как следует мир функций, вы поймете, что многие из них хорошо подходят для вычисляемых полей, но не для условий отбора. В следующих разделах вы увидите, где именно разумнее всего использовать каждую из них.
Примечание
Функции — это встроенная часть версии языка SQL (см. разд. «Режим SQL» главы 6), применяемой в программе Access для обработки данных.
Применение функций
Применяете ли вы простейшую или сложнейшую функцию, синтаксис — правила применения функции в выражении — остается неизменным. Для использования функции просто введите ее имя с последующими скобками. Затем внутрь скобок поместите все данные, которые нужны функции для выполнения ее вычислений (если это необходимо).
Для примера рассмотрим очень полезную функцию Round (), которая принимает число с дробной частью и убирает любые нежелательные позиции в дробной части. Эта функция — удобный способ приведения в порядок отображаемых значений вычисляемого поля. Вы оцените полезность функции Round (), если создадите выражение, подобное приведенному далее и вычисляющее цены, сниженные на 5%:
SalePrice: [Price] * 0.95
Примените это выражение к цене $43.97 и получите в результате 41.7715, что вряд ли будет выглядеть уместно на ценнике товара. Здесь пригодится функция Round (). Передайте ей неокругленное число и число знаков в дробной части, которое нужно сохранить:
SalePrice: Round([Price] * 0.95, 2)
Технически функции Round ( ) требуется две порции информации или два аргумента. Первый — это число, которое округляется (вданном случае это результат вычисления Price * 0. 95), а второй — количество цифр, которое вы хотите оставить справа от десятичной точки (2). В результате получается значение, округленное до двух десятичных знаков, или 41.77.
- Примечание
- Большинству функций, подобных Round (), требуются два или три аргумента. Но некоторые функции могут принять гораздо больше, в то время, как нескольким функциям вообще не нужны аргументы
- Часто задаваемый вопрос Банковское округление
Похоже, программа Access округляет числа неправильно. Как быть?
Вас может удивить то, что Access округляет число 21.985 до 21.98. Если вас учили округлять до большего числа, числа заканчивающиеся цифрой 5, то вы считаете, что результат должен быть 21.99. Этот способ называют арифметическим округлением. Программа Access не применяет арифметическое округление — она выбирает банковское округление, которое лучше в некоторых случаях.
Разница между арифметическим и банковским округлением заключается в трактовке цифры 5. Поскольку число 21.985 находится точно в середине, между числами 21.98 и 21.99, не просто решить, что с ним делать.
При постоянном округлении числа с 5 на конце до большего числа вносится систематическое отклонение в итоги и средние значения.
Поскольку вы округляете до большего чаще, чем до меньшего, любые итоги или среднее, которые вы вычисляете, получаются чуть больше, чем следовало бы.
Банковское округление решает эту проблему округлением 5 в одних случаях до большего числа, а в других до меньшего, в зависимости от соседней четной или нечетной цифры.
Число 21.985 округляется до меньшего числа 21.98, а число 21.995 — до большего, 22. Это не единственный способ борьбы с систематическим отклонением (можно решать случайным образом, когда округлять, а когда нет), но это общепринятая практика в бухгалтерских расчетах и статистике.
Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.
Источник: http://crypto.pp.ua/2011/03/funkcii-zaprosov/
Функции VBA для работы с числовыми значениями
Главная » Функции VBA » 28 Апрель 2011 Дмитрий 94469 просмотров
- ABS() — эта функция возвращает абсолютное значение переданного ей числа (то же число, но без знака). Например, ABS(3) и ABS(-3) вернут одно и то же значение 3.
- Int(), Fix() и Round()позволяют по разному округлять числа:
- Int() возвращает ближайшее меньшее целое;
- Fix() отбрасывает дробную часть;
- Round() округляет до указанного количества знаков после запятой.
Однако Round может вернуть не совсем ожидаемый результат. Если мы выполним такую строку кода
MsgBox Round(2.505, 2)
то результатом будет 2,5, хотя предполагалось получить 2,51. Поэтому порой для округления лучше использовать Format:
MsgBox Format(2.505, «#,##0.00») MsgBox Format(2.505, «#,##0.00»)
- Rnd и команда Randomize используются для получения случайных значений (очень удобно для генерации имен файлов и в других ситуациях). Перед вызовом функции Rnd() необходимо выполнить команду Randomize для инициализации генератора случайных чисел.
Dim lRundNum As Long, lMinNum As Long, lMaxNum As Long
lMinNum = 1: lMaxNum = 100
Randomize
lRundNum = Int(lMinNum + (Rnd() * lMaxNum))
MsgBox lRundNumDim lRundNum As Long, lMinNum As Long, lMaxNum As Long lMinNum = 1: lMaxNum = 100 Randomize lRundNum = Int(lMinNum + (Rnd() * lMaxNum)) MsgBox lRundNum
- Sgn() — позволяет вернуть информацию о знаке числа. Возвращает 1, если число положительное, -1, если отрицательное и 0, если проверяемое число равно 0.
- Mod() — Делит два числа и возвращает только остаток. Например, выражение 8 Mod 3 вернет число 2, т.к. без остатка(в виде дроби у результата деления) 8 делится на 3 только до 2-х(8 / 3 = 2,66666666666667).
При этом функция Mod учитывает и знак числа — если первое число или оба числа отрицательные, то результатом будет отрицательное число. Если же отрицательное только второе число — то результат будет положительным числом.При попытке получить остаток при делении чисел с плавающей запятой результат может быть не тем, который ожидается, потому что перед выполнением деления оба числа округляются по математическим законам(5 и выше до большего, 4 и ниже — до меньшего). Например, выражение 8 Mod 3.5 вернет , а выражение 8 Mod 3.4 — 2.
Статья помогла? Сделай твит, поделись ссылкой с друзьями!
Источник: https://www.excel-vba.ru/general/funkcii-vba/funkcii-vba-dlya-raboty-s-chislovymi-znacheniyami/