Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Особенности применения функции ROUND / 18 сообщений из 18, страница 1 из 1
01.02.2019, 11:27
    #39768002
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
Что нам говорит о ней справка? Вот что пишут здесь

Функция Round

Возвращает число, округленное до указанного количества десятичных разрядов.

Round(выражение[, количество_деятичных _знаков])

Синтаксис функции Round имеет следующие аргументы:

выражение - Обязательное. Числовое выражение, которое требуется округлить.

количество_деятичных _знаков - Необязательное. Число, указывающее количество цифр справа от десятичного разделителя включены округления. Если не указано, функция округляет число до ближайшего целого числа.

И больше ничего там не написано. Но поиск в интернете даёт следующее

Функция Microsoft Access Round возвращает число, округленное до указанного количества десятичных знаков. Однако функция Round ведет себя немного странно, поэтому, прежде чем использовать эту функцию, пожалуйста, прочитайте следующее:

Функция Round использует логику округления к четному. Если округляемое выражение заканчивается на 5, функция округления округляет выражение так, чтобы последняя цифра была четным числом.


Пример:

Round(12.55, 1)
Result: 12.6 (округление вверх)

Round(12.65, 1)
Result: 12.6 (округление вниз)

Round(12.75, 1)
Result: 12.8 (округление вверх)

Round(12.85, 1)
Result: 12.8 (округление вниз)

Как с этим бороться?
Предлагают прибавить к числу половинку последнего знака. Вот так

Round(12.55 + 0.005, 1)
Result: 12.6 (округление вверх)

Round(12.65 + 0.005, 1)
Result: 12.7 (округление вверх)

Round(12.75 + 0.005, 1)
Result: 12.8 (округление вверх)

Round(12.85 + 0.005, 1)
Result: 12.9 (округление вверх)

Другие предлагают прибавлять половинку предпоследнего знака при округлении

Round(12.55 + 0.05, 1)
Result: 12.6 (округление вверх)

Round(12.65 + 0.05, 1)
Result: 12.7 (округление вверх)

Round(12.75 + 0.05, 1)
Result: 12.8 (округление вверх)

Round(12.85 + 0.05, 1)
Result: 12.9 (округление вверх)

Третьи предлагают просто добавить к числу 0,0001

Round(12.55 + 0.0001, 1)
Result: 12.6 (округление вверх)

Round(12.65 + 0.0001, 1)
Result: 12.7 (округление вверх)

Round(12.75 + 0.0001, 1)
Result: 12.8 (округление вверх)

Round(12.85 + 0.0001, 1)
Result: 12.9 (округление вверх)

Во все случаях округление даёт верный результат.


-------------------------------------------------------------
А ты вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса?
...
Рейтинг: 0 / 0
01.02.2019, 12:24
    #39768064
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
Ну да... а поисследовать всё то же, но для отрицательных?


Я уж не говорю о том, что сколько не добавляй, всегда найдётся значение, которое даст неверный результат. Скажем, для наименьшего из предложенных выше 0,0001 такой казус будет, к примеру, со значением 12.644445.

Каждый тип округления требует своей собственной функции. К тому же учитывающей, что 0,5 в Single/Double может запросто оказаться как 0,499999..9999, так и 0,500000...0001.
...
Рейтинг: 0 / 0
01.02.2019, 12:39
    #39768080
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
Joss Функция Microsoft Access Round возвращает число, округленное до указанного количества десятичных знаков. Однако функция Round ведет себя немного странно, поэтому, прежде чем использовать эту функцию, пожалуйста, прочитайте следующее:


эта функция врала всегда, даже в древнем dBASE и foxPRO

столкнулись в расчете зарплаты, когда в расчете округлила некорректно ОТДЕЛЬНЫЕ значения сумм
причем не предсказуемо, например 100.1 округляло до 101рубля

написали программку, выловили еще несколько позиций --логики не поняли
---
перешли на округление str(сумма+0.005,2)
затем на str(сумма+0.0045,2)
...
Рейтинг: 0 / 0
01.02.2019, 13:55
    #39768171
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
тут - хорошая и быстрая реализация округления http://hiprog.com/index.php?option=com_content&task=view&id=160&Itemid=35
...
Рейтинг: 0 / 0
01.02.2019, 13:59
    #39768177
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
AkinaЯ уж не говорю о том, что сколько не добавляй, всегда найдётся значение, которое даст неверный результат. Скажем, для наименьшего из предложенных выше 0,0001 такой казус будет, к примеру, со значением 12.644445.

А какова функция округления? До какого знака Вы округляли?
...
Рейтинг: 0 / 0
01.02.2019, 14:36
    #39768222
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
Пардон, там опечатка.
JossRound(12.65 + 0.0001, 1)
Result: 12.7 (округление вверх)
Round(12.64995 + 0.0001, 1) = 12.7
...
Рейтинг: 0 / 0
01.02.2019, 15:10
    #39768253
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
Озверинтут - хорошая и быстрая реализация округления http://hiprog.com/index.php?option=com_content&task=view&id=160&Itemid=35 По-моему, очень неплохое решение.
...
Рейтинг: 0 / 0
04.02.2019, 13:03
    #39769173
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
На всякий случай записал сюда.

Автор - Quick_Yak взято отсюда http://hiprog.com/index.php?option=com_content&task=view&id=160&Itemid=35

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
'Вызов: Round2 (Value, D) или Round2(Value)
Function Round2(ByVal X As Double, _
Optional ByVal D As Byte = 0) As Double

Dim cur As Currency: cur = 10 ^ D

Round2 = Sgn(X) * Int(Abs(X) * cur + 0.5) / cur

End Function

заменил только
Код: plaintext
Optional ByVal D As Byte = 2
на
Код: plaintext
Optional ByVal D As Byte = 0
чтоб соответствовала стандартной.

Сделал проверку для одного знака после запятой.
Дало ошибку в случаях: 12.35, 12.45, 12.85, 12.95
Заменил
Код: plaintext
Round2 = Sgn(X) * Int(Abs(X) * cur + 0.5) / cur
на
Код: plaintext
Round2 = Sgn(X) * Int(Abs(X) * cur + 0.55) / cur
В случае: 12.05, 12.15, 12,25, 12.35, 12.45, 12.55, 12.65, 12.75, 12.85, 12.95 отработало правильно
12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 13.0

А вот для 12.049, 12.149, 12,249 ... дают ошибку на 0.1
12.1, 12.2, 12.3, ...

Для 12.039, 12.139, 12,239 ... результаты верны
12.0, 12.1, 12.2

Теперь заменил
Код: plaintext
Round2 = Sgn(X) * Int(Abs(X) * cur + 0.5) / cur
на
Код: plaintext
Round2 = Sgn(X) * Int(Abs(X) * cur + 0.51) / cur

Ошибок для данных типа 12.049, 12.149 ошибок нет зато для 12.0499, 12.1499 опят на 0.1 больше чем по правилам округления. Продолжаю экспериментировать.
...
Рейтинг: 0 / 0
04.02.2019, 14:05
    #39769216
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
ПЕНСИОНЕРКАэта функция врала всегда, даже в древнем dBASE и foxPRO

Эта функция никогда не врала и не врет.

Просто используется так называемое банковское округление . Используйте его и не ломайте себе голову.
...
Рейтинг: 0 / 0
04.02.2019, 14:09
    #39769218
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
AndrFПЕНСИОНЕРКАэта функция врала всегда, даже в древнем dBASE и foxPRO

Эта функция никогда не врала и не врет.

Просто используется так называемое банковское округление . Используйте его и не ломайте себе голову.

конечно не врет, только округляло 100.1 до 101
с этого началось мое знакомство с этой функцией --после этого в серьезных расчетах я ей не доверяла
...
Рейтинг: 0 / 0
04.02.2019, 14:16
    #39769222
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
AndrF,

была даже статья в журнале КОМПЬЮТЕР-ПРЕСС , объясняющая причину
советов, как избавиться от этого, в статье не было

перебрали все возможные варианты --всеж расчет зарплаты и не сошлись итоги
...
Рейтинг: 0 / 0
04.02.2019, 14:17
    #39769223
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
Посмотришь на этот геморрой - и начинаешь думать, не выполнять ли округление через преобразование в строку...
...
Рейтинг: 0 / 0
04.02.2019, 14:31
    #39769235
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
AkinaПосмотришь на этот геморрой - и начинаешь думать, не выполнять ли округление через преобразование в строку...
почти так и сделали, перебрав round-int-fix-str-format-дробную часть размера поля в таблице.....может и еще были варианты

добавляли довесок к половине последнего разряда, для копеек --сначала 0,5 затем 0,45

зарплату вообще считали в копейках, а только на печати делили на 100
...
Рейтинг: 0 / 0
04.02.2019, 14:36
    #39769238
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
помню, что получили в итоге
val(str(12.125,2))=12.13
val(format(12.125,"0.00"))=12.12
...
Рейтинг: 0 / 0
04.02.2019, 14:51
    #39769254
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
AndrFПЕНСИОНЕРКАэта функция врала всегда, даже в древнем dBASE и foxPRO

Эта функция никогда не врала и не врет.

Просто используется так называемое банковское округление . Используйте его и не ломайте себе голову.
Что такое "Банковское округление"

Похоже, программа 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. Это не единственный способ борьбы с систематическим отклонением (можно решать случайным образом, когда округлять, а когда нет), но это общепринятая практика в бух­галтерских расчетах и статистике.
...
Рейтинг: 0 / 0
04.02.2019, 14:53
    #39769256
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
ПЕНСИОНЕРКАперебрали все возможные варианты --всеж расчет зарплаты и не сошлись итоги
что помешало fix-ировать з/п и остаток переносить на след расчетный период ?
...
Рейтинг: 0 / 0
04.02.2019, 14:56
    #39769259
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
alecko,

позднее перешли на перенос копеек на следующий месяц, когда ширины талончика стало не хватать на зарплату в тысячах(до деноминации)
...
Рейтинг: 0 / 0
04.02.2019, 16:09
    #39769301
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенности применения функции ROUND
ПЕНСИОНЕРКА....конечно не врет, только округляло 100.1 до 101
с этого началось мое знакомство с этой функцией --после этого в серьезных расчетах я ей не доверяла
Код: vbnet
1.
2.
?round(100.1)
 100 

-никак не могу "познакомится"
(может так происходило не из-за применения Round, а по какой-нибудь другой причине?)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Особенности применения функции ROUND / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]