Имя: Пароль:
1C
1C 7.7
v7: Округление в ТИС
,
0 Санта Клаус
 
22.06.20
21:34
Ребята! Впервые заметил такой баг:

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

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

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


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


Что за ерунда? Спасибо
1 Cthulhu
 
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
не будет ли последствий? Вроде как на первый взгляд - нет
16 Cthulhu
 
22.06.20
23:06
(14): Окр - лишнее. запишется де-факто округленное согласно точности ресурса.
17 Злопчинский
 
22.06.20
23:35
(14)   //+изменил   = 117.42 - что и нужно вместо 117.41
то есть 117.41499999 ты решил округлить до 117.42?
18 Cthulhu
 
22.06.20
23:50
// Санта, на вот тебе - наслаждайся... и делай выводы:
    ЦелДлинаМаксимум=99; ДрДлинаМаксимум=77;    // а можно и на форму
    Сообщить("*** Тестирование (макс.цел="+ЦелДлинаМаксимум+"/макс.др="+ДрДлинаМаксимум+":","i");
    ЦелЧасть=""; Для ЦелЧастьДлина=1 По ЦелДлинаМаксимум Цикл
        ЦелЧасть=ЦелЧасть+Прав(""+ЦелЧастьДлина,1);
        ДрЧасть=""; Для ДрЧастьДлина=1 По ДрДлинаМаксимум-ЦелЧастьДлина Цикл
            ДрЧасть=ДрЧасть+Прав(""+ДрЧастьДлина,1);
            ЧислоСтрокой=ЦелЧасть+"."+ДрЧасть;
            ЧислоЧислом=Число(ЧислоСтрокой);
            Если ""+ЧислоЧислом+?(Прав(ДрЧасть,1)="0","0","")<>ЧислоСтрокой Тогда
                Сообщить(СимволТабуляции+"Число "+ЧислоСтрокой+" ("+(ЦелЧастьДлина
                +ДрЧастьДлина)+","+ДрЧастьДлина+") отличается от его представления "
                +ЧислоЧислом+?(Прав(ДрЧасть,1)="0","0","")+" ...","."); Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
19 Aleksey
 
22.06.20
23:50
(15) При определенных обстоятельствах при списание в 0 КоэффСписания может быть отличным от 1. Поэтому обычно сначала сравнивают на равенство, и только если показатели не равны используют КоэффСписания
20 tgu82
 
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) глСписаниеПартийТМЦ
не надо ничего там исправлять...