Число не округляется до конца

0 голосов
Andry.Boy в категории Как сделать...
Почему при использовании функции Round (x,2), где x - исходное число, а 2 - степень округления, у нас может выводится число не округленное до конца, то есть с большим количеством знаков после запятой и лишней частью?

Ответ: 1 шт.

0 голосов
arustamov_s

Проблема связана с особенностями хранения дробных десятичных чисел в двоичной системе счисления. Дело в том, что компьютеры могут хранить точно только целые числа и некоторые десятичные, поэтому им нужен какой-то способ представления большинства десятичных чисел. Это представление не совсем точное. Это касается не всех чисел.  

Например, числа 1/2, 1/4, 1/8 могут быть выражены точно, потому что все знаменатели являются степенью двойки. А числа 1/3, 1/6, 1/7, 1/9 могут вызывать трудности. Поэтому если у этих чисел мы будем увеличивать точность, то рано или поздно всплывет лишняя "доля". Функция Round работает в двоичной системе счисления, а результат выдается в десятичной.

Есть способ при котором это можно "исправить": мы переводим число в строку с заданной точностью и ненужные разряды исчезают.

Пример функции перевода в строку:

Format("%.2f", X), где "%.2f" - нужный формат с округлением до 2-го знака после запятой, а X - искомое число.

[email protected]

Коллеги, столкнулся с такой же проблемой, при расчетах для бухгалтерии: в актах постоянно возникала ошибка на 1 копейку. Опытным путем пришли к следующему. В калькуляторе:

round(156417.5/100*3,2)  = 4 692,52000000000060 : округление некорректно с т.з. математики и его величества ГЛАВНОГО БУХГАЛТЕРА

при этом 

round(156417.5*3/100,4) = 4 692,52500000000060 

это навело на мысль попробовать вариант:

round(round(156417.5*3/100,4),2) = 4 692,53000000000000 а это то, что нужно подать в акт :-)

Вариант через Format("%.2f", X) не подошел т.к. после округлений нужно делать расчеты, а обрамление VAL(Format("%.2f", X)) возвращал ошибку, т.е. VAL(Format("%.2f", 156417.5*3/100)) = 4 692,52000000000060

 

...