Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Округление в ТИС

v7: Округление в ТИС
Я
   Санта Клаус
 
22.06.20 - 21:34
Ребята! Впервые заметил такой баг:

ТаблИтогов.СуммаБезНДС*КоэффСписания = 117.415

Окр(ТаблИтогов.СуммаБезНДС*КоэффСписания,2,1) = 117.41  ?

Однако, если подставить в код (или в отладке) ЯВНО число  Окр(117.415,2,1) = 117.42 как и должно быть по математике


***********************
Такая конструкция все равно дает 117.41
ТекБезНДС = ТаблИтогов.СуммаБезНДС*КоэффСписания;
РегПартии.СуммаБезНДС    = Окр(ТекБезНДС,2,1);       = 117.41


Что за ерунда? Спасибо
   Cthulhu
 
1 - 22.06.20 - 21:37
не ерунда.
ТаблИтогов.СуммаБезНДС*КоэффСписания = 117.414999999999999999 а не 117.415
   Санта Клаус
 
2 - 22.06.20 - 21:39
(1) два раза округлять тогда можно, получается?
   Санта Клаус
 
3 - 22.06.20 - 21:41
если на калькуляторе разделить сумму/кол, то 117.415 и получается, откуда хвост еще?
   Санта Клаус
 
4 - 22.06.20 - 21:42
ладно, понял, а делать то что?)
   Злопчинский
 
5 - 22.06.20 - 21:43
(3) причем сум/кол к (0)..?
   Злопчинский
 
6 - 22.06.20 - 21:45
Смотреть из (0) в отладчике значения множителей с масимальной точностью, доступной в 1С, это вроде 22 знака после ЗПТ
   Санта Клаус
 
7 - 22.06.20 - 21:48
(5) я понял сейчас, что с коэф в периоде связано, но почему он тогда мне обрезает до трех знаков

2583,13 * 0.04545454545454545455 = 117.4149999999999

а выдает 117.415
   Санта Клаус
 
8 - 22.06.20 - 21:57
т.е когда произведение переменных ТаблИтогов.СуммаБезНДС*КоэффСписания - округляет до трех знаков,
если подставить хотя бы в один из множителей число, то не округляет до трез знаков - весь хвост выдает, что и надо, чтобы потом округлить. И где это зашито, в платформе что ли?
   Злопчинский
 
9 - 22.06.20 - 22:13
(8) могу ошибаться, но почитай правила определения точности результата.
Попробуй наоброт ради прикола
КоэффСписания*ТаблИтогов.СуммаБезНДС

И каковы параметры точности у ТаблИтогов.СуммаБезНДС
   Злопчинский
 
10 - 22.06.20 - 22:14
(7) "а выдает 117.415"
куда выдает? где выдает?
результат чему-то присваивается - смотри принимающую точность.
   Санта Клаус
 
11 - 22.06.20 - 22:16
(10) в отладчике результат умножения
   Санта Клаус
 
12 - 22.06.20 - 22:16
думаю сделать промежуточное округление до трех знако и потом до двух уже
   Санта Клаус
 
13 - 22.06.20 - 22:18
(10) в отладчике не 117.4149999999999, а 117.415
   Санта Клаус
 
14 - 22.06.20 - 22:23
//ресурсы

РегПартии.Количество        = Окр(ТаблИтогов.Количество    *КоэффСписания,5,1);
РегПартии.СуммаУпр        = Окр(ТаблИтогов.СуммаУпр    *КоэффСписания,2,1);
РегПартии.СуммаРуб        = Окр(ТаблИтогов.СуммаРуб    *КоэффСписания,2,1);
РегПартии.СуммаПлат        = Окр(ТаблИтогов.СуммаПлат    *КоэффСписания,2,1);
            
ТекСуммаБезНДС                  = Окр(ТаблИтогов.СуммаБезНДС*КоэффСписания,3,1);  //+добавил   = 117.415

            
РегПартии.СуммаБезНДС        = Окр(ТекСуммаБезНДС,2,1);                        //+изменил   = 117.42 - что и нужно вместо 117.41
   Санта Клаус
 
15 - 22.06.20 - 22:26
не будет ли последствий? Вроде как на первый взгляд - нет
   Cthulhu
 
16 - 22.06.20 - 23:06
(14): Окр - лишнее. запишется де-факто округленное согласно точности ресурса.
   Злопчинский
 
17 - 22.06.20 - 23:35
(14)  //+изменил   = 117.42 - что и нужно вместо 117.41
то есть 117.41499999 ты решил округлить до 117.42?
   Cthulhu
 
18 - 22.06.20 - 23:50
// Санта, на вот тебе - наслаждайся... и делай выводы:

    ЦелДлинаМаксимум=99; ДрДлинаМаксимум=77;    // а можно и на форму

    Сообщить("*** Тестирование (макс.цел="+ЦелДлинаМаксимум+"/макс.др="+ДрДлинаМаксимум+":","i");
    ЦелЧасть=""; Для ЦелЧастьДлина=1 По ЦелДлинаМаксимум Цикл
        ЦелЧасть=ЦелЧасть+Прав(""+ЦелЧастьДлина,1);
        ДрЧасть=""; Для ДрЧастьДлина=1 По ДрДлинаМаксимум-ЦелЧастьДлина Цикл
            ДрЧасть=ДрЧасть+Прав(""+ДрЧастьДлина,1);
            ЧислоСтрокой=ЦелЧасть+"."+ДрЧасть;
            ЧислоЧислом=Число(ЧислоСтрокой);
            Если ""+ЧислоЧислом+?(Прав(ДрЧасть,1)="0","0","")<>ЧислоСтрокой Тогда
                Сообщить(СимволТабуляции+"Число "+ЧислоСтрокой+" ("+(ЦелЧастьДлина
                +ДрЧастьДлина)+","+ДрЧастьДлина+") отличается от его представления "
                +ЧислоЧислом+?(Прав(ДрЧасть,1)="0","0","")+" ...","."); Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
   Aleksey
 
19 - 22.06.20 - 23:50
(15) При определенных обстоятельствах при списание в 0 КоэффСписания может быть отличным от 1. Поэтому обычно сначала сравнивают на равенство, и только если показатели не равны используют КоэффСписания
   tgu82
 
20 - 23.06.20 - 08:51
Округление это порой просто задалбывает
Особенно когда выписывается УПД в котором по товару несколько партий списывается с разными ГТД.
И тогда начинается расхождение на 1 копейку. И пляска с бубном чтоб это поправить.
Причем иногда все замечательно а иногда эта копейка вылезает.
   Санта Клаус
 
21 - 23.06.20 - 09:26
(20) в том то и дело, и править типовые механизмы округления как то не хочется и как кажется - это неправильно
   Санта Клаус
 
22 - 23.06.20 - 09:30
(17) если вычислить цену партии через деление суммы на количество, оставшееся на данный момент, то результат 117.416;
     если вычислять через КоэффСписания, как в глСписаниеПартийТМЦ , то результат 117.415 - в отладке и 117.41499999 - на калькуляторе
   Санта Клаус
 
23 - 23.06.20 - 09:32
+поэтому, вроде как, 117.416 округлить бы до 117.42 как показывает везде, кроме как в глСписаниеПартийТМЦ
   Злопчинский
 
24 - 23.06.20 - 11:39
(23) глСписаниеПартийТМЦ
не надо ничего там исправлять...


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.