Имя: Пароль:
1C
1С v8
Вопрос с подводным камнем на который налетают все начинающие
0 demart-omsk
 
27.08.12
07:40
Есть "Х" сумма денег, которую нужно разделить на сотрудников, пропорционально отработанному времени.

Как сделать, чтобы при сумме 10руб и деление на троих по три часа (при любой точности после запятой) не терялась копейка?
1 Wobland
 
27.08.12
07:41
никак. или у тебя есть любимчик, которому следует заплатить больше?
2 Мимохожий Однако
 
27.08.12
07:41
Последнему добавь копейку. Или забрось сдачу в общак.
3 Cube
 
27.08.12
07:42
Последнему челу прибавить разницу между Х и суммой значений, раскиданных по сотрудникам?
4 Wobland
 
27.08.12
07:42
вообще, деление - это от лукавого ©
5 ДенисЧ
 
27.08.12
07:42
(3) А почему последнему, а не первому?
6 Мимохожий Однако
 
27.08.12
07:43
Надо сначала определиться у кого малиновые штаны и кто сколько приседает.
7 demart-omsk
 
27.08.12
07:43
на счет копейки в общак - нормальная тема
8 Cube
 
27.08.12
07:43
(5) Да потому что я так сказал!))))
9 Wobland
 
27.08.12
07:43
(3) СЧ=ГСЧ.СулчайноеЧисло();
Сотрудник[СЧ].Сумма=Сотрудник[СЧ].Сумма+ОбщаяСумма-ТЗ.Итог("Сумма")
10 Песец
 
27.08.12
07:44
Купить на Х рублей водки и сообразить на троих.
11 Wobland
 
27.08.12
07:44
(5) потому что Итоге больше всех всегда достаётся ;)
12 Cube
 
27.08.12
07:47
(11) В пятничной ветке говорилось, что вместо ИТОГО надо выводить ИГОГО! %)))
13 IamAlexy
 
27.08.12
07:47
(0)
допустим у тебя три сотрудника и ты им выписал 10 рублей премии
соответственно среди них находишь руководителя и ему выплачиваешь 4 рубя, остальным двоим по три.

если это твой отдел и ты руководитель - ну ты сам дальше понимаешь кому выплатить 4 рубля...
14 Wobland
 
27.08.12
07:49
(13) усложняем задачу. сумма премии 11 рублей
15 ILM
 
гуру
27.08.12
07:52
(0) Добавь две копейки и дели поровну.
16 Cube
 
27.08.12
07:55
(14) На 500 человек...
17 Ranger_83
 
27.08.12
07:57
(0)А чей-то они налетать должны?
18 Mikeware
 
27.08.12
07:59
"налетают" не "начинающие", а "дятлы"...
19 IamAlexy
 
27.08.12
07:59
(14) ясно же что себе/начальнику 2 рубля
20 Wobland
 
27.08.12
08:01
(19) и оставшимся по 3.50? ;)
21 Ranger_83
 
27.08.12
08:02
Помниться еще в 7-ке с бухшей распределяли остатки по перечисленным взносам в ПФР.Остатки разумеется разносили по себе :)
22 demart-omsk
 
27.08.12
08:05
ЕСЛИ 10 руб делить на 6чел по 3 часа выйдет 1,67 на нос, при сумме 10,02, что тоже косяк

Есть знатоки тут?)
23 demart-omsk
 
27.08.12
08:08
Если 11 (по 1,83 = 10,98 вместо 11) и тп
24 dmpl
 
27.08.12
08:08
(0) Добавь к ним начальника - тогда копейки будут нормально делиться.
25 Wobland
 
27.08.12
08:09
(22)СЧ=ГСЧ.СулчайноеЧисло();
Разница=ОбщаяСумма-ТЗ.Итог("Сумма");
Сотрудник[СЧ].Сумма=Сотрудник[СЧ].Сумма+Макс(Разница, -Разница)
26 dmpl
 
27.08.12
08:10
(16) 6 руб. начальнику, остальным по 1 коп. :)
27 dmpl
 
27.08.12
08:12
(22) Дык ставь себя - и эту копеечку себе начисляй (за ту попаболь, которую ты получил, разбираясь с этими копейками раньше). Глядишь, за месяц пара рублей набежит ;)
28 МишКа
 
27.08.12
08:14
(0) Компьютеры не способны делать точные вычисления. Ты это только что узнал?
29 Chai Nic
 
27.08.12
08:15
Вообще к v8 тема отношения не имеет, это общая проблема для всех учетно-денежных систем) Вообще, конечно, самым правильным способом было бы выбирать "счастливчика" с добавленной копеечкой методом генерации случайных чисел. А если всегда добавлять первому-последнему, в некоторых случаях может произойти накопление. Скажем, если список сортирован по ФИО, а распределения происходят сотню раз в день)
30 vde69
 
27.08.12
08:17
(0) есть такое понятие "нарастающим итогом", почитай про это :)
31 Ranger_83
 
27.08.12
08:17
(29)Ога.Итого получит больше всех:)
32 snegovik
 
27.08.12
08:19
Вот когда автор столкнется с несовпадением НДС по строкам документа и в Итого - вот это будет подводный камень...))
33 vde69
 
27.08.12
08:22
(32) а вот когда конвертация СНДС-безНДС-СНДС вернет не прервоначальное, вот тогда будет еще прикольнее
34 ДенисЧ
 
27.08.12
08:23
(28) Компьютеры способны. Просто человек не способен получить 3.(3) рубля...
35 D_Pavel
 
27.08.12
08:23
(0) Винни пух: Вот 10 горшков мёда, каждому по 8.
Пятачок: по 8 на каждого не получается.
Винни пух: Ниче не знаю, я свою долю уже съел.
36 Dmitry77
 
27.08.12
08:23
или начнет распредалять валютные авансы с НДС.

Правильное решение - описываешь эту ситуацию человеку давшему задание и просишь от него уточнить ТЗ.
37 DVN
 
27.08.12
08:25
Последнему -весь остаток.
38 МишКа
 
27.08.12
08:27
(34) И где, интересно, найти такой компьютер, который на 10/3 выдаст 3.(3)?
39 Dmitry77
 
27.08.12
08:29
(38) нормальный механизм распределение это не база/кол-во

это итерационный процес

сумма1 = база/количество
сумма2 =  (база -сумма1) /(количество-1)

и т.д.
40 D_Pavel
 
27.08.12
08:30
А не надо ничего сразу округлять. Пусть данные рассчитываются как можно точнее без округления, а округляются только в конечном результате.
41 ДенисЧ
 
27.08.12
08:31
(38) Вот у меня на столе стоит комп, который при делении 10 на 3 спокойно выдаёт 3 целых и 1/3...
42 МишКа
 
27.08.12
08:32
(34) Да и, кстати, человек-то как-раз может получить 3.(3).
43 МишКа
 
27.08.12
08:34
(41) Поздравляю! Ты его сам сделал?
44 D_Pavel
 
27.08.12
08:34
(43) У меня тоже такой комп. Покупной из магазина
45 МишКа
 
27.08.12
08:37
(44) Из магазина инопланетной техники, наверное ))))
46 D_Pavel
 
27.08.12
08:38
(45) нет, не угадал. Обычный комп, как у всех
47 D_Pavel
 
27.08.12
08:40
48 МишКа
 
27.08.12
08:43
Меня ваша серьезность просто убивает.
49 K-5
 
27.08.12
08:43
(0) Вычисляй и храни отдельно хвостик округления в следующих рассчетах используй
50 Fragster
 
гуру
27.08.12
08:43
Делал так:

ОстатокОтработано = Сотры.Итог("Время");
ОстатокСуммы = Сумма;
Для каждого Сотр Из Сотры Цикл
  Сотр.Сумма = ОстатокСуммы * Сотр.Время / ОстатокОтработано;
  ОстатокСуммы = ОстатокСуммы - Сотр.Сумма;
  ОстатокОтработано = ОстатокОтработано - Сотр.Время;
КонецЦикла;
51 Ненавижу 1С
 
гуру
27.08.12
08:44
(48) компьютеры умеют хранить числа в рациональном виде - числитель и знаменатель
52 Fragster
 
гуру
27.08.12
08:45
(51) а копейку-то кому заплатить?
53 Fragster
 
гуру
27.08.12
08:49
в (50) - предпоследнему
54 МишКа
 
27.08.12
08:50
(51) И что? Вычисления все равно будут приближенные.
Кроме того, не всякую дробь можно сохранить/показать (период может превысить память).
55 Ненавижу 1С
 
гуру
27.08.12
08:51
(52) себе любимому )) тот пост был офтопик
(54) гипотетически конечно да
56 badboychik
 
27.08.12
08:51
копейку отчисляйте в фонд помощи голодающим африканским детям, и польза будет и думать не надо
57 Fragster
 
гуру
27.08.12
08:54
вспоминается фильм "хакеры" и "гусеница", откусывающая по центу от каждой транзакции
58 ptiz
 
27.08.12
09:13
Я думал, что тут про: Для каждого СтрокаТЗ Из ТЗ Цикл ТЗ.Удалить(СтрокаТЗ) ...
59 D_Pavel
 
27.08.12
09:24
(54) Чтобы получилась дробь для хранения которой не хватит памяти, вычисления этой дроби должны быть еще сложнее. А таких сложных расчётов в 1с не ведется.
60 Serg_1960
 
27.08.12
09:27
Сорри, это всего лишь вариант:
Нечто подобное решал этак в 198...не помню каком году :) Но точно - именно по распределению премиальных в цеху среди бригад.

Ключевой вопрос "Кому копейку?" решался просто :) Накапливал суммы "исчисленно" с максимальной точностью и "начисленно" по правилам округления и отдавал копейку тому, кто больше всего был "обделен" такой системой распределения.
61 МишКа
 
27.08.12
09:28
Подели на своем сайте 10946 на 6765.
62 МишКа
 
27.08.12
09:29
(61) к (59)
63 demart-omsk
 
27.08.12
09:38
Ситуация

Если сумма 10руб делится на 6чел по 3 часа на нос по 1,67 при сумме получ 10,02

0,02 копейки лишние, надо учитывать как - так и + к сумме
64 Wobland
 
27.08.12
09:39
(63) а что я там говорил про плюс и минус?
65 dmpl
 
27.08.12
09:39
А вообще, не проще ли общую сумму выработки подогнать, чтобы она нацело делилась?
66 Serg_1960
 
27.08.12
09:44
(65) Иногда - не проще. Всегда найдется тот, кто готов удавиться из-за одной копейки. Или задушить другого. Что ещё хуже :)

А если без шуток, то есть сумма и именно эту(!) сумму надо распределить. А не "плюс-минус", "примерно", "где-то около"...
67 shpioleg
 
27.08.12
09:51
"Ходжа, а как мы поделим на двоих барана и 2 овцы!?"
"Ну, так и быть. Мы с бараном на двоих возьмем одну овцу и одна овца достанется тебе." :)
68 dmpl
 
27.08.12
10:09
(66) В этом случае см. ответ в (27).
69 iceman2112
 
27.08.12
10:16
Привет, земляк
70 iceman2112
 
27.08.12
10:17
(69) это к (0)
71 Lama12
 
27.08.12
10:20
(0)
Кидай на максимальную сумму.
Если суммы равные, то без разницы кому кинуть.
При добавлении на максимальную сумму, относительная ошибка вычислений является самой минимальной.
При добавлени остатка на последнюю или первую сумму, а они могут оказаться минимальными, сумма относиельной ошибки вычисления может достигать максимальных значений.