К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

Прошу прокомментировать поведение 1С 7.7 при округлении

Гость
0 - 28.09.2019 - 12:22
Код:
Процедура Сформировать()
	                             
	Сообщить("--------------------------------------");
	РасчетныйНДС = ОКР(59.85 * ?(0 = 0,20 / (100 + 20),0),2,1);
	РасчетныйНДС1= 59.85 * ?(0 = 0,20 / (100 + 20),0); 
	РасчетныйНДС2 = ОКР(РасчетныйНДС1,2,1);
	Сообщить("Расчетный НДС 0: "+РасчетныйНДС);
	Сообщить("Расчетный НДС 1: "+РасчетныйНДС1);
	Сообщить("Расчетный НДС 2: "+РасчетныйНДС2);
	                                                   
	Сообщить("--------------------------------------");
	РасчетныйНДС = ОКР(59.85 * 20 / (100 + 20),2,1);
	РасчетныйНДС1 = 59.85 * 20 / (100 + 20);
	РасчетныйНДС2 = ОКР(РасчетныйНДС1,2,1);
	Сообщить("Расчетный НДС 0: "+РасчетныйНДС);
	Сообщить("Расчетный НДС 1: "+РасчетныйНДС1);
	Сообщить("Расчетный НДС 2: "+РасчетныйНДС2);
	 
Коэф = 20/120;                              
	
	Сообщить("--------------------------------------");
	РасчетныйНДС = ОКР(59.85 * Коэф,2,1);
	РасчетныйНДС1 = 59.85 * Коэф;
	РасчетныйНДС2 = ОКР(РасчетныйНДС1,2,1);
	Сообщить("Расчетный НДС 0: "+РасчетныйНДС);
	Сообщить("Расчетный НДС 1: "+РасчетныйНДС1);
	Сообщить("Расчетный НДС 2: "+РасчетныйНДС2);                                                  
	
КонецПроцедуры
Соответственно результаты:

--------------------------------------
Расчетный НДС 0: 9.97
Расчетный НДС 1: 9.975
Расчетный НДС 2: 9.97
--------------------------------------
Расчетный НДС 0: 9.98
Расчетный НДС 1: 9.975
Расчетный НДС 2: 9.98
--------------------------------------
Расчетный НДС 0: 9.97
Расчетный НДС 1: 9.975
Расчетный НДС 2: 9.97
--------------------------------------



1 - 28.09.2019 - 13:36
(0) Тут дело не в округлении, а в формате хранения чисел в 1С. Во втором варианте сначала 59.85 умножается на 20, а потом делится на 120 - фактически, делится на 6 и результат точно равен 9.975, без десятитысячных, стотысячных и т.д.

А первом и третьем вариантах сначала вычисляется значение 1/6, которое не может быть точно выражено десятичной дробью, и поэтому где-то в потрохах 1С неизбежно округляется. И вот результат этого округления, умноженный на 59.85, дает тоже округленный результат, уже "неправильный":

Окр(59.85 * 20 / 120,2,1) = 9.98
Окр(20 / 120 * 59.85,2,1) = 9.97

Математически эти выражения одинаковы, но из-за "внутреннего" округления бесконечных дробей в компьютере (и даже 1С тут не при чем!)- имеем то, что имеем.
Гость
2 - 30.09.2019 - 15:10
(1)Благодарю за пояснение


К списку вопросов






Copyright ©, Все права защищены