Релиз 8.2.19.90
Например: Окр(6.3448,2) = 6.34, хотя должно быть =6.35
А если так: Окр(Окр(6.3448,3),2) = 6.35
Т.е. получается функция Окр учитывает при округлении разряд на один больше, чем порядок округления, остальные просто отсекает?
Это где такое "округление" чисел придумали? В чем прикол, кто-нибудь может объяснить?
Например: Окр(6.3448,2) = 6.34, хотя должно быть =6.35
А если так: Окр(Окр(6.3448,3),2) = 6.35
Т.е. получается функция Окр учитывает при округлении разряд на один больше, чем порядок округления, остальные просто отсекает?
Это где такое "округление" чисел придумали? В чем прикол, кто-нибудь может объяснить?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) venger,
хм. Вообще-то Окр(6.3448,2) = 6.34, согласно общепринятым правилам округления. По крайней мере так было раньше, до присоединения Крыма, щас хз, мало ли что могло поменяться :)
Например: Окр(6.3448,2) = 6.34, хотя должно быть =6.35
хм. Вообще-то Окр(6.3448,2) = 6.34, согласно общепринятым правилам округления. По крайней мере так было раньше, до присоединения Крыма, щас хз, мало ли что могло поменяться :)
(1) venger, Почитайте синтакс помошник и все поймете, 3 параметр подставляйте
Встроенные функции языка.Окр (Script functions.Round)
Встроенные функции языка (Script functions)
Окр (Round)
Синтаксис:
Окр(<Число>, <Разрядность>, <РежимОкругления>)
Параметры:
<Число> (обязательный)
Тип: Число.
Исходное число.
<Разрядность> (необязательный)
Тип: Число.
Определяет число знаков дробной части, до которых производится округление. Если параметр отрицательный, то число округляется до соответствующего разряда в целой части, начиная с младших разрядов.
Параметр обязательный, если указан параметр <РежимОкругления>.
Значение по умолчанию: 0.
<РежимОкругления> (необязательный)
Тип: РежимОкругления.
Определяет режим округления. Помимо системного перечисления допускается использование числового параметра: 0 - если при округлении 1.5 = 1; 1 - если при округлении 1.5 = 2.
Значение по умолчанию: Окр15как20.
Возвращаемое значение:
Тип: Число.
Число, полученное в результате округления.
Описание:
Округляет исходное число до нужной разрядности в соответствии с заданным режимом округления.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример:
// Округлим цену до сотен рублей
ОкругленнаяЦена = Окр(Цена, -2);
// Округлим цену до копеек
ОкругленнаяЦена = Окр(Цена, 2);
--------------------------------------------------------------------------------
Методическая информация
Встроенные функции языка.Окр (Script functions.Round)
Встроенные функции языка (Script functions)
Окр (Round)
Синтаксис:
Окр(<Число>, <Разрядность>, <РежимОкругления>)
Параметры:
<Число> (обязательный)
Тип: Число.
Исходное число.
<Разрядность> (необязательный)
Тип: Число.
Определяет число знаков дробной части, до которых производится округление. Если параметр отрицательный, то число округляется до соответствующего разряда в целой части, начиная с младших разрядов.
Параметр обязательный, если указан параметр <РежимОкругления>.
Значение по умолчанию: 0.
<РежимОкругления> (необязательный)
Тип: РежимОкругления.
Определяет режим округления. Помимо системного перечисления допускается использование числового параметра: 0 - если при округлении 1.5 = 1; 1 - если при округлении 1.5 = 2.
Значение по умолчанию: Окр15как20.
Возвращаемое значение:
Тип: Число.
Число, полученное в результате округления.
Описание:
Округляет исходное число до нужной разрядности в соответствии с заданным режимом округления.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример:
// Округлим цену до сотен рублей
ОкругленнаяЦена = Окр(Цена, -2);
// Округлим цену до копеек
ОкругленнаяЦена = Окр(Цена, 2);
--------------------------------------------------------------------------------
Методическая информация
(11)Лажа в голове.
1с округляет верно. Эксель при использовании ОКРУГЛ округляет верно. ОКРУГЛВВЕРХ/ВНИЗ созданы для принудительного нематематического округления.
ОКРУГЛВВЕРХ
Округляет число до ближайшего большего по модулю.
он и 1.00000000001 до 2 округлит.
1с округляет верно. Эксель при использовании ОКРУГЛ округляет верно. ОКРУГЛВВЕРХ/ВНИЗ созданы для принудительного нематематического округления.
ОКРУГЛВВЕРХ
Округляет число до ближайшего большего по модулю.
он и 1.00000000001 до 2 округлит.
(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:)))
А вот учитывать при округлении до 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) Ну там уже размер самой переменной, которая хранит число может ограничить эту "бесконечность":)))
P.S. Да и третий параметр получается тоже отрабатывает тогда верно, т.е. не только для целых, Окр(1.55,1,РежимОкругления.Окр15как10) = 1.5
В общем, всем спасибо! (разобрался в математике за пятый класс:-)))) Ну, после майских и не такое бывает:)))
P.S. Да и третий параметр получается тоже отрабатывает тогда верно, т.е. не только для целых, Окр(1.55,1,РежимОкругления.Окр15как10) = 1.5
В общем, всем спасибо! (разобрался в математике за пятый класс:-)))) Ну, после майских и не такое бывает:)))
ну да, так оно и было помоему всю жизнь в 1С.. могу только подтвердить такое же поведение ОКР на платформе 8.3.4.437
ПС: в Excel
ОКРУГЛВВЕРХ(6,3448;2) = 6,35
ОКРУГЛВНИЗ(6,3448;2) = 6,34
---
в 1С разницы нет даже если задаешь РежимОкругления, то есть проблема в принципе есть
ПС: в Excel
ОКРУГЛВВЕРХ(6,3448;2) = 6,35
ОКРУГЛВНИЗ(6,3448;2) = 6,34
---
в 1С разницы нет даже если задаешь РежимОкругления, то есть проблема в принципе есть
Округление, в общем случае, - операция мутная и требующая понимания физического смысла значения и точности исходных данных. Математическое округление (меньше 0.5 вниз, больше 0.5 вверх) используется для минимизации погрешности округления. В вашем случае abs(6,3448-6.35) = 0,0052, abs(6.3448-6.34) = 0.0048, так что математически верно округлять вниз.
Округление 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)) = ИСТИНА
Вот так это работает. Надеюсь понятно объяснил.
Причем, количество значащих знаков берется без учета предыдущих округлений. Пример:
Округляемое число "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)) = ИСТИНА
Вот так это работает. Надеюсь понятно объяснил.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот