Вверх ↑
Этот топик читают: Гость
Ответов: 41
Рейтинг: 0
#1: 2025-10-29 13:45:50 ЛС | профиль | цитата
Салют!
Столкнулся с такой особенность элемtнета MathParse при использовании функции округления (round).
Нас на математике другому учили!
На примере оба числа должны быть округлены до сотых (копеек) одинаково. Но нет:

Add(MainForm,2953706,203,231)
{
link(onCreate,15209776:doEvent1,[])
}
Add(MathParse,3773185,399,245)
{
MathStr="round(%1,0.01)"
link(onResult,16453834:doText,[])
link(X1,7392989:Text,[])
}
Add(Label,16453834,546,245)
{
Left=32
Top=41
}
Add(MathParse,8003164,462,308)
{
MathStr="round(%1,0.01)"
link(onResult,9140319:doText,[])
link(X1,2092020:Text,[])
}
Add(Label,9140319,546,308)
{
Left=128
Top=45
}
Add(Hub,15209776,294,245)
{
link(onEvent1,3773185:doCalc,[])
link(onEvent2,8003164:doCalc,[(382,258)(382,314)])
}
Add(Edit,7392989,399,175)
{
Left=30
Top=16
Text="18.925"
DataType=4
}
Add(Edit,2092020,462,175)
{
Left=30
Top=16
Text="18.9251"
DataType=4
}

карма: 0

0
Ответов: 876
Рейтинг: 322
#2: 2025-11-08 15:06:54 ЛС | профиль | цитата
sansey73, С моей колокольни, все правильно. Нас в школе учили... до половины - вниз, больше половины -вверх.
карма: 1

0
Ответов: 8974
Рейтинг: 824
#3: 2025-11-08 16:37:02 ЛС | профиль | цитата
В бухгалтерии с округлением беда, при суммировании платежей могут возникнуть разницы, особенно при разбитии платежа с учётом налога на добавленную стоимость, Не раз приходилось отпаивать девочек-бухгалтеров успокоительными каплями, когда у них не хватало копеек
Поставьте округление на четыре знака (до 0.0001), а результат уже округляйте до двух знаков, до копеек (0.01)

Редактировалось 1 раз(а), последний 2025-11-08 16:38:50
карма: 19

0
Ответов: 990
Рейтинг: 207
#4: 2025-11-08 19:22:10 ЛС | профиль | цитата
sansey73 писал(а):
Столкнулся с такой особенность элемtнета MathParse при использовании функции округления (round).
Нас на математике другому учили!

Там ещё веселее
Add(MainForm,7403548,91,140)
{
link(onCreate,605549:doFor,[])
}
Add(MathParse,6126843,259,154)
{
MathStr="round(%1)"
link(onResult,277124:doString,[])
}
Add(For,605549,147,154)
{
End=9
link(onEvent,12345668:doOperation,[])
}
Add(Math,12345668,196,154)
{
Op2=0.5
link(onResult,6126843:doCalc,[])
}
Add(Memo,2099244,378,154)
{
Left=75
Top=45
Width=280
Height=200
Align=5
Font=[Lucida Console,12,0,0,204]
Antialiased=1
Strings=#21:Результаты округления|0:|
ScrollBars=3
}
Add(FormatStr,277124,322,154)
{
Mask=" %1 - > %2"
link(onFString,2099244:doAdd,[])
link(Str1,12345668:Result,[(328,145)(300,145)(300,194)(202,194)])
}


Редактировалось 1 раз(а), последний 2025-11-08 19:22:40
карма: 20

0
Ответов: 41
Рейтинг: 0
#5: 2025-11-10 06:45:32 ЛС | профиль | цитата
kamakama писал(а):
sansey73, С моей колокольни, все правильно. Нас в школе учили... до половины - вниз, больше половины -вверх.

Что правильно, а саму половину куда? В этом-то и вопрос!
Вот и на весёлом примере Gunta, видно, что округление у парсера проводится с ошибкой.
Пока для себя состругал такой костылик (round(%1+1e-5,0.01)):
Add(MainForm,2953706,203,231)
{
Width=291
Height=140
Position=1
link(onCreate,15209776:doEvent1,[])
}
Add(MathParse,3773185,399,245)
{
MathStr="round(%1,0.0001)"
link(onResult,12620146:doCalc,[])
link(X1,8875927:Var2,[])
}
Add(Label,16453834,574,245)
{
Left=32
Top=41
}
Add(MathParse,8003164,462,308)
{
MathStr="round(%1,0.01)"
link(onResult,9140319:doText,[])
link(X1,2092020:Text,[])
}
Add(Label,9140319,574,308)
{
Left=96
Top=41
}
Add(Hub,15209776,294,245)
{
OutCount=3
link(onEvent1,3773185:doCalc,[])
link(onEvent2,8003164:doCalc,[(382,258)(382,314)])
link(onEvent3,6430380:doCalc,[(373,265)(373,377)])
}
Add(Edit,7392989,399,175)
{
Left=30
Top=16
Text="18.925"
DataType=4
}
Add(Edit,2092020,462,175)
{
Left=94
Top=16
Text="18.9251"
DataType=4
}
Add(MathParse,12620146,490,245)
{
MathStr="round(%1,0.01)"
link(onResult,16453834:doText,[])
}
Add(MathParse,6430380,441,371)
{
MathStr="round(%1+1e-5,0.01)"
link(onResult,241731:doText,[])
link(X1,8875927:Var3,[(447,222)])
}
Add(GetDataEx,8875927,399,217)
{
link(Data,7392989:Text,[])
}
Add(Label,241731,574,371)
{
Left=32
Top=57
}


Редактировалось 2 раз(а), последний 2025-11-10 08:29:39
карма: 0

0
Ответов: 990
Рейтинг: 207
#6: 2025-11-10 13:20:49 ЛС | профиль | цитата
sansey73 писал(а):
Что правильно, а саму половину куда? В этом-то и вопрос!
Вот и на весёлом примере Gunta, видно, что округление у парсера проводится с ошибкой.

Я думаю, что никакой ошибки нет. Это так называемое бухгалтерское округление и почти весь мир округляет именно так. Нас в школе учили математическому округлению, когда 5 округляется в большую сторону.
Вот пример двух видов округления

Add(MainForm,7403548,126,77)
{
link(onCreate,605549:doFor,[])
}
Add(For,605549,182,91)
{
Start=90
End=99
link(onEvent,4675259:doOperation,[])
link(onStop,15086441:doData,[(242,104)(242,146)])
}
Add(Math,12345668,301,91)
{
Op2=0.005
link(onResult,277124:doString,[])
}
Add(FormatStr,277124,350,91)
{
Mask="'%1;' + [Math]::Round(%1, 2) + ';' + [Math]::Round(%1, 2, 1) "
link(onFString,1602621:doAdd,[])
}
Add(Math,4675259,252,91)
{
OpType=3
Op2=100
link(onResult,12345668:doOperation,[])
}
Add(StrList,1602621,406,91)
{
}
Add(DoData,15086441,406,140)
{
link(onEventData,3519105:doConsoleExec,[])
link(Data,1602621:Text,[])
}
Add(WinExec,3519105,455,126)
{
FileName="powershell"
Mode=0
Point(onConsoleResult)
Point(onConsoleError)
Point(doConsoleExec)
link(onConsoleResult,2630416:doWork2,[])
link(onConsoleError,2630416:doWork3,[(501,153)])
}
Add(HubEx,2630416,497,140)
{
link(onEvent,10822758:doCharset,[])
}
Add(Charset,10822758,532,140)
{
link(onCharset,3493911:doConvert,[])
}
Add(MTStrTbl,4713517,651,84)
{
Width=506
Height=244
Align=5
Font=[MS Sans Serif,12,0,0,1]
Name="tabl"
Columns=#5:Число|13:Бухгалтерское|14:Математическое|
ColorItems=0
Redaction=0
Grid=0
}
Add(MST_Load,5405697,651,133)
{
ColNameHeader=1
MSTControl="tabl"
}
Add(StreamConvertor,3493911,588,140)
{
Mode=7
link(onResult,5405697:doLoadFromStream,[])
}

карма: 20

0
6
Сообщение
...
Прикрепленные файлы
(файлы не залиты)