Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Прошу прокомментировать поведение 1С 7.7 при округлении (http://forums.kuban.ru/f1040/proshu_prokommentirovat-_povedenie_1s_7_7_pri_okruglenii-8960709.html)

Sasha 28.09.2019 12:22

Прошу прокомментировать поведение 1С 7.7 при округлении
 
[code]
Процедура Сформировать()

Сообщить("--------------------------------------");
РасчетныйНДС = ОКР(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);

КонецПроцедуры
[/code]

Соответственно результаты:

--------------------------------------
Расчетный НДС 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
--------------------------------------

Ткачик 28.09.2019 13:36

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

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

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

[b]Математически[/b] эти выражения одинаковы, но из-за "внутреннего" округления бесконечных дробей в компьютере (и даже 1С тут не при чем!)- имеем то, что имеем.

Sasha 30.09.2019 15:10

(1)Благодарю за пояснение


Текущее время: 21:20. Часовой пояс GMT +3.