Что за лажа с функцией округления?

1. venger 2124 07.05.14 15:08 Сейчас в теме
Релиз 8.2.19.90

Например: Окр(6.3448,2) = 6.34, хотя должно быть =6.35

А если так: Окр(Окр(6.3448,3),2) = 6.35

Т.е. получается функция Окр учитывает при округлении разряд на один больше, чем порядок округления, остальные просто отсекает?

Это где такое "округление" чисел придумали? В чем прикол, кто-нибудь может объяснить?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. starjevschik 07.05.14 15:15 Сейчас в теме
(1) venger,
Например: Окр(6.3448,2) = 6.34, хотя должно быть =6.35

хм. Вообще-то Окр(6.3448,2) = 6.34, согласно общепринятым правилам округления. По крайней мере так было раньше, до присоединения Крыма, щас хз, мало ли что могло поменяться :)
Merkalov; romulanin; Wum; Tym1980; ivangrant; ChernoVl; Rustavelli; DmitrySinichnikov; five_seven; awk; ipoloskov; +11 Ответить
4. deniseek77 86 07.05.14 15:20 Сейчас в теме
(1) venger, Почитайте синтакс помошник и все поймете, 3 параметр подставляйте


Встроенные функции языка.Окр (Script functions.Round)
Встроенные функции языка (Script functions)
Окр (Round)
Синтаксис:

Окр(<Число>, <Разрядность>, <РежимОкругления>)
Параметры:

<Число> (обязательный)

Тип: Число.
Исходное число.
<Разрядность> (необязательный)

Тип: Число.
Определяет число знаков дробной части, до которых производится округление. Если параметр отрицательный, то число округляется до соответствующего разряда в целой части, начиная с младших разрядов.
Параметр обязательный, если указан параметр <РежимОкругления>.
Значение по умолчанию: 0.
<РежимОкругления> (необязательный)

Тип: РежимОкругления.
Определяет режим округления. Помимо системного перечисления допускается использование числового параметра: 0 - если при округлении 1.5 = 1; 1 - если при округлении 1.5 = 2.
Значение по умолчанию: Окр15как20.

Возвращаемое значение:

Тип: Число.
Число, полученное в результате округления.
Описание:

Округляет исходное число до нужной разрядности в соответствии с заданным режимом округления.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример:

// Округлим цену до сотен рублей
ОкругленнаяЦена = Окр(Цена, -2);

// Округлим цену до копеек
ОкругленнаяЦена = Окр(Цена, 2);


--------------------------------------------------------------------------------

Методическая информация
5. AllexSoft 07.05.14 15:23 Сейчас в теме
(4) deniseek77, а вы попробуйте... 6.35 не получите хоть что туда ставь...
6. starjevschik 07.05.14 15:26 Сейчас в теме
(5) AllexSoft, да не может 6.35 получиться, математика против :)
Sean1s; tamidi; ivangrant; Alissa_Maty; +4 Ответить
9. AllexSoft 07.05.14 15:31 Сейчас в теме
(6) starjevschik, то есть Excel против математики ? см то что добавил в (3)
10. mymyka 07.05.14 15:37 Сейчас в теме
(9)
Функция ОКРУГЛВВЕРХ подобна функции ОКРУГЛ, за тем исключением, что округление всегда производится с избытком.

справка к экселю.
Таки да, эксель не против математики, ОКРУГЛ выполняется по вполне математическим правилам.
11. AllexSoft 07.05.14 15:38 Сейчас в теме
(10) mymyka, то есть все таки в 1С лажа ?
12. mymyka 07.05.14 15:42 Сейчас в теме
(11)Лажа в голове.
1с округляет верно. Эксель при использовании ОКРУГЛ округляет верно. ОКРУГЛВВЕРХ/ВНИЗ созданы для принудительного нематематического округления.

ОКРУГЛВВЕРХ

Округляет число до ближайшего большего по модулю.

он и 1.00000000001 до 2 округлит.
DmitrySinichnikov; agrustny; Boeing_B_52; AllexSoft; cool.vlad4; starjevschik; +6 Ответить
7. deniseek77 86 07.05.14 15:27 Сейчас в теме
13. venger 2124 07.05.14 16:11 Сейчас в теме
(5) С параметрами округления (3-й параметр) вообще похоже, что для округления до целых только работает.

А вот учитывать при округлении до 2-х разрядов после запятой только 3-й, похоже действительно (математически) правильно выходит. Погрешность по модулю меньше у варианта, когда до 6,34 округлять число 6,34482.

6,34482 - 6,34 = 0,00482
-1*(6,34482 - 6,35) = 0,00518

Н-да, а я че то думал, что справа надо идти, т.е. 6,34482 округляется до 6,3448, потом до 6,345, потом уже до 6,35:)))
14. starjevschik 07.05.14 16:13 Сейчас в теме
(13) venger,
Н-да, а я че то думал, что справа надо идти, т.е. 6,34482 округляется до 6,3448, потом до 6,345, потом уже до 6,35:)))

прикольно было бы по такому правилу округлять бесконечные десятичные дроби, гы :)
15. venger 2124 07.05.14 16:23 Сейчас в теме
(14) Ну там уже размер самой переменной, которая хранит число может ограничить эту "бесконечность":)))

P.S. Да и третий параметр получается тоже отрабатывает тогда верно, т.е. не только для целых, Окр(1.55,1,РежимОкругления.Окр15как10) = 1.5

В общем, всем спасибо! (разобрался в математике за пятый класс:-)))) Ну, после майских и не такое бывает:)))
16. agrustny 19 07.05.14 16:56 Сейчас в теме
(14)(15) Раз пятый класс освоили, задача для шестого: округлить
1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/...))))))
3. AllexSoft 07.05.14 15:15 Сейчас в теме
ну да, так оно и было помоему всю жизнь в 1С.. могу только подтвердить такое же поведение ОКР на платформе 8.3.4.437
ПС: в Excel
ОКРУГЛВВЕРХ(6,3448;2) = 6,35
ОКРУГЛВНИЗ(6,3448;2) = 6,34
---
в 1С разницы нет даже если задаешь РежимОкругления, то есть проблема в принципе есть
8. saiten 246 07.05.14 15:30 Сейчас в теме
Округление, в общем случае, - операция мутная и требующая понимания физического смысла значения и точности исходных данных. Математическое округление (меньше 0.5 вниз, больше 0.5 вверх) используется для минимизации погрешности округления. В вашем случае abs(6,3448-6.35) = 0,0052, abs(6.3448-6.34) = 0.0048, так что математически верно округлять вниз.
DmitrySinichnikov; Boeing_B_52; mymyka; +3 Ответить
17. agrustny 19 07.05.14 16:58 Сейчас в теме
потом можно учиться лажи, мути и физсмыслу...
18. kgdrsu 27.11.20 11:58 Сейчас в теме
А как в 1С реализовать Excel функцию ОКРУГЛВНИЗ ?
19. FatPanzer 27.11.20 12:02 Сейчас в теме
(18) Умножить на 10^Х (где X - число знаков после запятой), взять целую часть Цел(), и обратно разделить на 10^Х.
20. gofforsk 12 06.11.22 13:52 Сейчас в теме
Округление 1С осуществляется по правилу наименьшей абсолютной погрешности, т.е. выбирается то значение(нижняя или верхняя граница, значения между которыми лежит округляемое число) в при котором она меньше(без учета знака, т.е. модуль числа).
Причем, количество значащих знаков берется без учета предыдущих округлений. Пример:

Округляемое число "0.4748"

============
Точность 2
============
1. 0.47 - 0.4748 = - 0.0048, модуль 0.0048
2 .0.48 - 0.4748 = 0.0052, модуль 0.0052

Выбирается вариант 1, т.к. модуль результата первого вычисления меньше модуля результата второго вычисления

Т.е. Окр(0.4748,2) будет 0.47

Теперь округлим до двух знаков, первоначально округлив до трех:

============
Точность 3
============
1. 0.474 - 0.4748 = - 0.0008, модуль 0.0008
2 .0.475 - 0.4748 = 0.0002, модуль 0.0002

Выбирается вариант 2, т.к. модуль результата первого вычисления больше модуля результата второго вычисления

Т.е. Окр(0.4748,3) равно 0.475

Далее.....

============
Точность 2
============
1. 0.47 - 0.475 = - 0.0005, модуль 0.0005
2 .0.48 - 0.475 = 0.0005, модуль 0.0005

Модули вычислений равны. При таком варианте верхняя граница выбирается в зависимости от третьего параметра функции Окр() («0» - «1.5До1», «1» - «1.5До2», по умолчанию «1»). И в данном случае, если третий параметр будет «0», то выбирается вариант 1, иначе третий параметр «1»(по умолчанию), вариант «2».

Т.е. Окр(Окр(0.4748,3),2) (оно же Окр(Окр(0.4748,3),2),1) равно 0.48, а Окр(Окр(0.4748,3),2, 0) равно 0.47.

Поэтому (Окр(0.4748,2) = Окр(Окр(0.4748,3),2)) = ЛОЖЬ, а (Окр(0.4748,2) = Окр(Окр(0.4748,3),2,0)) = ИСТИНА

Вот так это работает. Надеюсь понятно объяснил.
21. user856012 14 06.11.22 15:27 Сейчас в теме
(20)
Надеюсь понятно объяснил.
Главное - оперативно! ;-)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот