AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 04.09.2007, 15:14   #1  
kashperuk is offline
kashperuk
Участник
kashperuk's Avatar
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Join Date: 30.05.2004
Location: Atlanta, GA, USA
Алгоритм расчета общей суммы
Граждане форумчане,

Помогите составить алгоритм рассчета общей суммы.
Вкратце опишу проблему на примере:

Формируется отчет, в котором выводятся строки документа с указанием кол-ва, цены и суммы по строке. По этим суммам рассчитывается итоговая сумма документа.
Фиксированно кол-во по строке и исходная сумма (в отчет не попадает).
Все суммы округляются до 2ого знака после запятой.

Цена (расчетная) рассчитывается как Сумма (исходная) / Кол-во
Сумма (расчетная) рассчитывается как Цена (расчетная) * Кол-во

Пример:


Итого, 9 копеек разницы.

Необходимо:
Менять цену так, чтобы свести к минимуму расхождение общей суммы.
Attached Images
 

Last edited by kashperuk; 04.09.2007 at 15:18. Reason: картинку вставил
This post has been rated by: petr (2).
Old 04.09.2007, 15:20   #2  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Join Date: 09.07.2002
Location: Parndorf, AT
Цифры 3.34 и 6.63 заранее известны?
Если да, то сравнивайте расчетную и исходную накопленные суммы по каждой строке:

Delta1 = 3,34 - decRound(3,34/10, 2) = 3,34 - 3,30 = 0,04
decRound(Delta1/10, 2) = decRound(0,004, 2) = 0 => коррекция невозможна

Delta2 = 3,34 + 6,63 - 3,30 - 6,60 = 0,07
decRound(Delta2/10, 2) = decRound(0,007, 2) = 0,01 => коррекция = +0,01 => цена = 0,67

Last edited by EVGL; 04.09.2007 at 15:27.
Old 04.09.2007, 15:21   #3  
kashperuk is offline
kashperuk
Участник
kashperuk's Avatar
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Join Date: 30.05.2004
Location: Atlanta, GA, USA
Quote:
Originally Posted by EVGL View Post
Цифры 3.34 и 6.63 заранее известны?
Да, конечно.
Известно кол-во по строке, правильная (до округления) сумма по строке, и, соответственно, правильная (без округления) общая сумма.
Old 04.09.2007, 15:32   #4  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Join Date: 09.07.2002
Location: Parndorf, AT
Тогда см. предыдущий пост. Возможно, надо будет еще обработку последней строки вставить, чтобы оставшаяся ошибка включалась в последнюю расчетную сумму (если это возможно, что последняя "Сумма расчетная" != "Цена расчетная" * "Количество").

Проще говоря:
10 ----- 0,67 ----- 6,67 (!= 6,70) ----- 6,63

Last edited by EVGL; 04.09.2007 at 15:35.
Old 04.09.2007, 16:02   #5  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Join Date: 30.05.2005
Location: Швейцария
Quote:
Менять цену так, чтобы свести к минимуму расхождение общей суммы.
А что это значит? Вы имеете ввиду, что в первом случае цена расчетная 0,33 но вы будете выводить в отчет 0,34 чтобы потом при расчете суммы (расчетной) получалось 3,4 а в общей сумме 10, что ближе к 9,97 чем 9,9?
Old 04.09.2007, 16:06   #6  
kashperuk is offline
kashperuk
Участник
kashperuk's Avatar
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Join Date: 30.05.2004
Location: Atlanta, GA, USA
Да. То есть разница между 10.00 и 9.97 будет уже 0.03, а не 0.07.
То есть пытаемся уменьшить общее отклонение итоговой суммы
Old 04.09.2007, 16:13   #7  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
Quote:
Originally Posted by kashperuk View Post
Формируется отчет, в котором выводятся строки документа с указанием кол-ва, цены и суммы по строке. По этим суммам рассчитывается итоговая сумма документа.

...

Итого, 9 копеек разницы.
По-моему, уже сказали. Но еще раз:
суммы всегда храняться с большим числом знаков.
суммы всегда отображаются в отчете с округлением.

Рассчитывать итоговую сумму по НЕОРУГЛЕННЫМ суммам - большая методическая ошибка.
Перед выводом, перед записью в БД, любая сумма должна быть округлена при помощи Currency::amount(...) или Currency::amountCur(...). Это правило.

Кстати, любое количество также должно быть округлено перед выводом и перед записью в БД.
__________________
полезное на axForum, github, vk, coub.
Old 04.09.2007, 16:17   #8  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Join Date: 09.07.2002
Location: Parndorf, AT
Тот алгоритм, который я описал, используется в русской книге продаж в случае "НДС по оплате" с несколькими оплатами к одной накладной. Нетрудно видеть, что ошибка в моем алгоритме <= 0,01 * Среднее_количество_по_строке ~ 0,10 в вашем случае.
Old 04.09.2007, 16:18   #9  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Join Date: 30.05.2005
Location: Швейцария
Ну тогда вам в математический справочник. Идея, насколько я помню такая:
У вас есть числа A1, A2, An (в вашем примере это 3,34 и 6,63). Вам надо найти такие числа B1, B2, Bn (в вашем случае это сумма округлвения), чтобы выполнялось два условия. 1-ое условие: (А1/Х1 - В1)*100 - целое число. (Х1 - это кол-во для первой строки 10). Второе условие: Сумма (В1*Х1 + В2*Х2 + Вn*Хn) - (А1 + А2 + Аn) стремиться к нулю (причем по модулю). Т.е. задача на минимизацию. Я думаю такие задачи решаютмя в численных методах, или может еще в каком разделе математики.

Подумаю вечерком, может что сам еще вспомню, но тут скорее надо литературу по этой теме искать или знакомых математиков трясти.
This post has been rated by: kashperuk (3).
Old 04.09.2007, 16:19   #10  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Join Date: 09.07.2002
Location: Parndorf, AT
Quote:
Originally Posted by mazzy View Post
По-моему, уже сказали. Но еще раз:
суммы всегда храняться с большим числом знаков.
суммы всегда отображаются в отчете с округлением.

Рассчитывать итоговую сумму по НЕОРУГЛЕННЫМ суммам - большая методическая ошибка.
Перед выводом, перед записью в БД, любая сумма должна быть округлена при помощи Currency::amount(...) или Currency::amountCur(...). Это правило.

Кстати, любое количество также должно быть округлено перед выводом и перед записью в БД.
Это Вы к чему, собственно говоря? У Ивана не только все суммы, а все цены до второго знака округлены. В этом и проблема.
Old 04.09.2007, 16:21   #11  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
Quote:
Originally Posted by kashperuk View Post
Известно кол-во по строке, правильная (до округления) сумма по строке, и, соответственно, правильная (без округления) общая сумма.
Quote:
Originally Posted by EVGL View Post
У Ивана не только все суммы, а все цены до второго знака округлены.
Разве?
__________________
полезное на axForum, github, vk, coub.
Old 04.09.2007, 16:23   #12  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Join Date: 09.07.2002
Location: Parndorf, AT
Quote:
Originally Posted by mazzy View Post
Разве?
А что, не заметно, что везде два знака после запятой?
Задача-то типовая: восстановить цену по сумме.
Old 04.09.2007, 16:24   #13  
kashperuk is offline
kashperuk
Участник
kashperuk's Avatar
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Join Date: 30.05.2004
Location: Atlanta, GA, USA
Вот немного усложненный пример, на котором можно думать



Расхождение в этом случае = 11.29

2 mazzy:
Да оно так и хранится.
Проблема в том, что цены округлены до второго знака тоже.
и бухгалтерия не хочет видеть более 2 знаков в цене.
А соответственно возникают расхождения.

P.S. Именно, EVGL правильно говорит
Attached Thumbnails
Click image for larger version

Name:	example2.PNG
Views:	831
Size:	7.0 KB
ID:	2913  
Old 04.09.2007, 16:30   #14  
Михаил Андреев is offline
Михаил Андреев
Участник
Компания АМАНД
Лучший по профессии 2009
 
1,300 / 239 (10) ++++++
Join Date: 09.11.2001
Location: Химки, Московская область
Quote:
Originally Posted by kashperuk View Post
Проблема в том, что цены округлены до второго знака тоже.
и бухгалтерия не хочет видеть более 2 знаков в цене.
Чего? А почему не до целых гривен?
Посмотрите настройку валюты на закладке Округление. Обычно достаточно там настроить: цены округлять до сотой доли единицы валюты и т.д.
Или, речь о закупках?
Откуда такая забавная задачка?
__________________
Михаил Андреев
https://www.amand.ru
Old 04.09.2007, 16:33   #15  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Join Date: 30.05.2005
Location: Швейцария
to Михаил Андреев, mazzy
Да вполне нормальная задача. Посмотрите как получаются отклонения в основной валюте, это практически тоже самое. Только там никто разницу не оптимизирует, а просто она кидается на счет расхождений в основной валюте и все.

А kashperuk хочет в своем отчете эту разницу немного оптимизировать, т.е. уменьшить
Old 04.09.2007, 16:33   #16  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
Quote:
Originally Posted by EVGL View Post
А что, не заметно, что везде два знака после запятой?
Задача-то типовая: восстановить цену по сумме.
В том то и дело, что ВИДНО.
Не факт, что так и ХРАНИТСЯ.
Аксапта всегда ПОКАЗЫВАЕТ округленные суммы, а ХРАНИТ как записал программист.

Quote:
Originally Posted by kashperuk View Post
Да оно так и хранится.
Точно-точно?

Quote:
Originally Posted by kashperuk View Post
и бухгалтерия не хочет видеть более 2 знаков в цене.
Ну и пусть ВИДИТ!

Если же вопрос не о представлении, а о ХРАНЕНИИ.
У цен свое правило округления задается в параметрах валют.
У цен свой тип, для которого можно настроить свое количество знаков после запятой.

Но тогда у бухов будет расхождение с контрагентами, которые работают с двумя знаками после запятой в цене

Если цена округляется, то согласен с EVGL, будут нестыковки либо в цене каждой строчки, либо в общем НДСе в зависимости от того, в каком направлении будет выполняться расчет (от цены к общей сумме или от общей суммы к цене)
__________________
полезное на axForum, github, vk, coub.
This post has been rated by: kashperuk (3).
Old 04.09.2007, 16:38   #17  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Join Date: 09.07.2002
Location: Parndorf, AT
Мой вариант: 0.33 --- 0.67 --- 0.23 --- 2.10 => 271.50. Да, хреново.
0.33 --- 0.67 --- 0.24 --- 2.05 => 280.75 гораздо лучше.
This post has been rated by: kashperuk (3).
Old 04.09.2007, 16:43   #18  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Join Date: 09.07.2002
Location: Parndorf, AT
Самый тупой вариант - это на каждом шаге попробовать изменить цену на -0,01 и +0,01 соответственно, посмотреть, что будет. Т.е. порядка 2^(количество_строк -1) итераций.
Old 04.09.2007, 17:11   #19  
kashperuk is offline
kashperuk
Участник
kashperuk's Avatar
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Join Date: 30.05.2004
Location: Atlanta, GA, USA
Есть, кстати, еще одно условие, усложняющее в значительной мере алгоритм
Цена не должна уменьшаться/увеличиваться более, чем на 10% от своего начального значения.

Отослал данные для анализа знакомому профессору. Если ничего умного не придумает до завтра, будем сами изобретать какой-то много-итерационный алгоритм.

Спасибо всем за участие. Продолжение следует...
Old 04.09.2007, 17:17   #20  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Join Date: 30.05.2005
Location: Швейцария
Quote:
Спасибо всем за участие.
Я думаю, что спасибом тут не отделаться. Надо будет выложить получившийся алгоритм.
 

Similar Threads
Thread Thread Starter Forum Replies Last Post
Алгоритм расчета отчета весьма сложноват glibs DAX: Прочие вопросы 0 20.03.2009 12:08
Корректировка суммы налога в закупке ymv2000 DAX: Функционал 4 26.10.2006 09:19
!!!HELP!!! ???Проблемы расчета больничного??? rus_stas DAX: Функционал 4 22.02.2005 17:46
Алгоритм расчета З/П nicko DAX: Функционал 2 26.02.2004 08:21
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 01:48.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.