![]() |
Прошу прокомментировать поведение 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 -------------------------------------- |
(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С тут не при чем!)- имеем то, что имеем. |
(1)Благодарю за пояснение |
Текущее время: 21:20. Часовой пояс GMT +3. |