Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Казус с банковским округлением / 25 сообщений из 33, страница 1 из 2
17.04.2018, 15:22
    #39631682
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
Считается, что в бухгалтерских документах правильнее использовать банковское округление, где четное старшее число округляет 5 в меньшую сторону, а нечетное в большую.
Написал формулу, работающую по логике как в школе учили - округляем последовательно каждый разряд, затем следующий округляем в зависимости от того, больше, меньше или равно 5.
Так вот, казус получился!
Берем число 0.6349 и округляем его до 2 знаков.
ОЧЕВИДНО, что это должно быть 0.63, т.к. 49 меньше 50.
Но по правилам округления получается: 0.6349 -> 0.635 -> 0.64.
Так бы и округляло обычное НЕ-банковское, но MySQL однако же оказался умнее и ROUND(0.6349) выдал как 0.63.
А самописная формула BANK_ROUND по-школьному выдала 0.64.
...
Рейтинг: 0 / 0
17.04.2018, 15:30
    #39631688
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
17.04.2018 15:22, svnvlad пишет:
> MySQL однако же оказался умнее

ему никто не указ - ни стандарты, ни арифметика...

зы: не меряй это ЭТИМ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.04.2018, 15:31
    #39631689
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
svnvladБерем число 0.6349 и округляем его до 2 знаков.
ОЧЕВИДНО, что это должно быть 0.63, т.к. 49 меньше 50.
Но по правилам округления получается: 0.6349 -> 0.635 -> 0.64.
Так бы и округляло обычное НЕ-банковское, но MySQL однако же оказался умнее и ROUND(0.6349) выдал как 0.63.
А самописная формула BANK_ROUND по-школьному выдала 0.64.Имхо гон. Если округляешь до 2 цифр - то работаешь с числом 0.634. А его как не округляй - 0.63 должно получится
...
Рейтинг: 0 / 0
17.04.2018, 15:31
    #39631691
под ван
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
У нас что тут началась неделя округлений?
...
Рейтинг: 0 / 0
17.04.2018, 15:33
    #39631695
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
white_niggersvnvladБерем число 0.6349 и округляем его до 2 знаков.
ОЧЕВИДНО, что это должно быть 0.63, т.к. 49 меньше 50.
Но по правилам округления получается: 0.6349 -> 0.635 -> 0.64.
Так бы и округляло обычное НЕ-банковское, но MySQL однако же оказался умнее и ROUND(0.6349) выдал как 0.63.
А самописная формула BANK_ROUND по-школьному выдала 0.64.Имхо гон. Если округляешь до 2 цифр - то работаешь с числом 0.634. А его как не округляй - 0.63 должно получится
там же изначально были 4 цифры: 0.6349, а 49 округлится как 50.
...
Рейтинг: 0 / 0
17.04.2018, 15:34
    #39631698
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
под ванУ нас что тут началась неделя округлений?
Типа того. Один гвоздь в ботинке способен испортить все путешествие.
...
Рейтинг: 0 / 0
17.04.2018, 15:35
    #39631699
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
Дичь!
Круглые сутки!
Семь дней в неделю!
...
Рейтинг: 0 / 0
17.04.2018, 15:37
    #39631702
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
svnvladНаписал формулу, работающую по логике как в школе учили - округляем последовательно каждый разряд, затем следующий округляем в зависимости от того, больше, меньше или равно 5.

Меня в школе и после школы учили совсем по другому.
1. Отбрасываем все разряды кроме последнего перед округляемым.
2. Округляем в соответствии с правилом.
...
Рейтинг: 0 / 0
17.04.2018, 15:47
    #39631711
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
Соколинский БорисsvnvladНаписал формулу, работающую по логике как в школе учили - округляем последовательно каждый разряд, затем следующий округляем в зависимости от того, больше, меньше или равно 5.

Меня в школе и после школы учили совсем по другому.
1. Отбрасываем все разряды кроме последнего перед округляемым.
2. Округляем в соответствии с правилом.
:D озадачили...
...
Рейтинг: 0 / 0
17.04.2018, 15:47
    #39631712
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
всю жизнь округлял каждый разряд)))
...
Рейтинг: 0 / 0
17.04.2018, 15:49
    #39631715
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
17.04.2018 15:37, Соколинский Борис пишет:
> Меня в школе и после школы учили совсем по другому.
> 1. Отбрасываем все разряды кроме последнего перед округляемым.
> 2. Округляем в соответствии с правилом.

тебя учили в эпоху тоталитаризма.
пора отринуть своё позорное прошлое.
молодая поросль взошла на ниве либерального образования.
им принадлежит будущее.

(восклицательных знаков добавить по вкусу)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.04.2018, 15:59
    #39631726
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
Соколинский БорисsvnvladНаписал формулу, работающую по логике как в школе учили - округляем последовательно каждый разряд, затем следующий округляем в зависимости от того, больше, меньше или равно 5.

Меня в школе и после школы учили совсем по другому.
1. Отбрасываем все разряды кроме последнего перед округляемым.
2. Округляем в соответствии с правилом.
В случае с числом 0.6349 логично - последнюю цифру просто отбрасываем и 4 округляем в меньшую сторону, до 0.63.
А теперь число 0.6459 - оно очевидно ближе к 0.65, т.к. там не 50, а 59 в конце. Т.е. правильно будет считать его как 0.646 -> 0.65. Округляя по банковски же, мы отбросим последнюю девятку, и 0.645 округлим до 0.64, т.к. 4 - четная.
...
Рейтинг: 0 / 0
17.04.2018, 16:07
    #39631739
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
svnvladВ случае с числом 0.6349 логично - последнюю цифру просто отбрасываем и 4 округляем в меньшую сторону, до 0.63.
А теперь число 0.6459 - оно очевидно ближе к 0.65, т.к. там не 50, а 59 в конце. Т.е. правильно будет считать его как 0.646 -> 0.65. Округляя по банковски же, мы отбросим последнюю девятку, и 0.645 округлим до 0.64, т.к. 4 - четная.
YouTube Video
...
Рейтинг: 0 / 0
17.04.2018, 16:10
    #39631745
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
svnvladА теперь число 0.6459 - оно очевидно ближе к 0.65Округление и поиск ближайшего числа это разные вещи. Если вам нужно округление - делаете так, как сказал Борис. Если нужно ближайшее число - берете двух соседних кандидатов (0.63 и 0.64) и вычитаете из них исходное число. Где меньше разность, то и ближе
...
Рейтинг: 0 / 0
17.04.2018, 16:24
    #39631763
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
Мимопроходящий,
ну и что, я только что смотрел такое видео. Но там ничего нет про банковское округление.
И я еще в детстве недоумевал, что значит "т.к. пятерка посередине, то ДОГОВОРИЛИСЬ округлять ее в большую сторону". Как это можно договориться регулярно наращивать ошибку? Банковское округление хотя бы тупо распределяет ее по очереди то туда, то сюда, т.к. она на самом деле "ни вашим, ни нашим".

Тут логика судя по всему должна быть такой:

Берем число например 0.6459.
1. Отбрасываем все после 3 разряда, получаем 0.645.
2. Если оно равно исходному числу (0.6459 = 0.645), то значит там 5, которая ровно посередине - и далее используем банковское округление.
3. Если же числа не равны, значит там не ровно 5, а больше или меньше, значит используем НЕ банковское, а используем обычное.
...
Рейтинг: 0 / 0
17.04.2018, 16:28
    #39631767
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
svnvladКак это можно договориться регулярно наращивать ошибку? Любое округление порождает ошибки, просто по определению. Банковское минимизирует ошибку при суммировании, арифметическое - при вычитании.
...
Рейтинг: 0 / 0
17.04.2018, 16:33
    #39631770
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
svnvladМимопроходящий,
ну и что, я только что смотрел такое видео. Но там ничего нет про банковское округление.
И я еще в детстве недоумевал, что значит "т.к. пятерка посередине, то ДОГОВОРИЛИСЬ округлять ее в большую сторону". Как это можно договориться регулярно наращивать ошибку? Банковское округление хотя бы тупо распределяет ее по очереди то туда, то сюда, т.к. она на самом деле "ни вашим, ни нашим".

Тут логика судя по всему должна быть такой:

Берем число например 0.6459.
1. Отбрасываем все после 3 разряда, получаем 0.645.
2. Если оно равно исходному числу (0.6459 = 0.645), то значит там 5, которая ровно посередине - и далее используем банковское округление.
3. Если же числа не равны, значит там не ровно 5, а больше или меньше, значит используем НЕ банковское, а используем обычное.
Тебе осталось понять, что для "банковских" вычислений не требуется "округлений". Достаточно разобраться в том, как хранятся в ЭВМ вещественные числа и отчего их не везде можно использовать.
...
Рейтинг: 0 / 0
17.04.2018, 16:43
    #39631783
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
чччДТебе осталось понять, что для "банковских" вычислений не требуется "округлений". Достаточно разобраться в том, как хранятся в ЭВМ вещественные числа и отчего их не везде можно использовать.
Почему?
Тариф за тонну 5,5$. При пересчете на рубли с учетом курса 58,5814 получается 322,1977 руб. за тонну.
За 15,5 тонн получится 4994,06435 руб.
И таких строк десятки.
Нужно вычислить общую сумму и вывести каждую строку, округленную до 2 знаков, и общую сумму, округленную до 2 знаков.
Не говорю уже о том, что сумма округленных строк и округление суммы неокругленных строк выдаст разный результат.
Но главное, что нельзя округлять тариф до 2 знаков, т.к., за сотни тонн эти разряды превратятся в десятки рублей ошибки.
...
Рейтинг: 0 / 0
17.04.2018, 16:57
    #39631810
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
Даже если тариф округлить до 2 знаков. 15,5 тонн сведет точность на нет.
...
Рейтинг: 0 / 0
17.04.2018, 17:19
    #39631834
jmp_original
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
1856 сообщений у человека... просто жесть.
...
Рейтинг: 0 / 0
17.04.2018, 17:25
    #39631846
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
svnvlad,
Тебе обязательно нужно одну тему в разных топиках обсуждать?
Банковское округление тут вообще не причем.
Умножаешь тариф на массу и округляешь до копеек - получишь точное соответствие в копейках.
Как корректно перевести в рубли уже обсудили.
...
Рейтинг: 0 / 0
18.04.2018, 09:28
    #39632184
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
svnvlad, цифры несут какой-то физический смысл. Если это стоимость какого-то товара, то у него есть физическое ограничение в разрядах -- 2 разряда. Как ты будешь в магазине платить 20 рублей и 06435 копейки при стоимости товара 20,06435 рублей?! Не всегда нужна точность до 12 знака после запятой.
...
Рейтинг: 0 / 0
18.04.2018, 10:16
    #39632213
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
goldmi45svnvlad, цифры несут какой-то физический смысл. Если это стоимость какого-то товара, то у него есть физическое ограничение в разрядах -- 2 разряда. Стоимость - производная величина, имеющая размерность "деньги/ед.товара", и может иметь сколько угодно знаков после запятой. Аналогично с тарифами и курсом доллара.
Но когда в результате перемножений возникают просто "деньги", полученная величина обязательно должна округляться до минимальной единицы, такой величины как "4994,06435 рублей" не существует.
...
Рейтинг: 0 / 0
18.04.2018, 11:33
    #39632295
Cane Cat Fisher
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
Соколинский БорисСтоимость - производная величина, имеющая размерность "деньги/ед.товара", и может иметь сколько угодно знаков после запятой.

Наверное, более общепринято называть эту штуку "Цена" = "деньги/ед.товара". А "Стоимость" = "деньги".

В школе даже тема так и называлась - "Цена, количество, стоимость", и с дробями выводили одно из другого.
...
Рейтинг: 0 / 0
18.04.2018, 13:44
    #39632477
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Казус с банковским округлением
Соколинский БорисsvnvladНаписал формулу, работающую по логике как в школе учили - округляем последовательно каждый разряд, затем следующий округляем в зависимости от того, больше, меньше или равно 5.

Меня в школе и после школы учили совсем по другому.
1. Отбрасываем все разряды кроме последнего перед округляемым.
2. Округляем в соответствии с правилом.Когда .5 округляется всегда вверх, можно конечно отбросить все последующие разряды. Но для банковского округления это не работает: .5 надо округлять к четному, а .50001 таки всегда вверх.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Казус с банковским округлением / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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