JMP에서 사용하는 기본 반올림을 변경하기 위해 짝수로 반올림하는 기능을 추가합니다. 파이썬 그리고 아르 자형 IEEE 754를 따르고 기본적으로 짝수로 반올림). 또한 교육 스크립트를 추가하여 짝수로 반올림 대 가장 가까운 것으로 반올림의 효과를 보여줍니다. 내 이해에 반올림은 예를 들어 다음과 같은 기본 동작입니다. IEEE 754 - 반올림 규칙(wikipedia.org) 가장 가까운 값으로 반올림하면 반올림된 값에서 합계 및 평균과 같은 집계 통계를 계산할 때 편향을 줄여야 합니다.
다음은 예제 스크립트입니다(최고의 데모가 아닐 수도 있습니다...).
Names Default To Here(1);
// https://en.wikipedia.org/wiki/IEEE_754#Rounding_rules
// https://blogs.sas.com/content/iml/2019/11/11/round-to-even.html
// https://stackoverflow.com/questions/311696/why-does-net-use-bankers-rounding-as-default
row_count = 400;
dt = New Table("Bankers_demo", Add Rows(row_count), New Column("TrueValue", Numeric, Continuous, Formula(0.25 * (Row() - 100))));
dt << New Column("RoundToNearest", Numeric, Continuous, Formula(Round(:TrueValue, 0)));
dt << New Column("RoundToEven",
Numeric,
Continuous,
Formula(
l = Words(Char(:TrueValue), ".");
If(N Items(l) == 1,
:TrueValue,
If(l[2] == "5",
If(Modulo(Num(l[1]), 2),
Ceiling(:TrueValue),
Floor(:TrueValue)
),
Round(:TrueValue, 0)
)
);
)
);
dt << New Column("TrueSum", Numeric, Continuous, Formula(Col Cumulative Sum(:TrueValue)));
dt << New Column("NearestSum", Numeric, Continuous, Formula(Col Cumulative Sum(:RoundToNearest)));
dt << New Column("EvenSum", Numeric, Continuous, Formula(Col Cumulative Sum(:RoundToEven)));
dt << New Column("ErrorNearest", Numeric, Continuous, Formula(Abs(:TrueSum - :NearestSum)));
dt << New Column("ErrorEven", Numeric, Continuous, Formula(Abs(:TrueSum - :EvenSum)));
dt << New Column("TrueAvg", Numeric, Continuous, Formula(:TrueSum / Row()));
dt << New Column("NearestAvg", Numeric, Continuous, Formula(:NearestSum / Row()));
dt << New Column("EvenAvg", Numeric, Continuous, Formula(:EvenSum / Row()));
nw = New Window("Rounding",
H List Box(
Panel Box("Actions",
Button Box("Add Row", dt << Add Rows(1, At End)),
Button Box("Add 10 Rows", dt << Add Rows(10, At End)),
Button Box("Add 100 Rows", dt << Add Rows(100, At End)),
Button Box("Add 1000 Rows", dt << Add Rows(1000, At End))
),
gb = dt << Graph Builder(
Size(528, 456),
Show Control Panel(0),
Variables(X(:TrueValue), Y(:ErrorNearest, Position(1)), Y(:ErrorEven, Position(1))),
Elements(Points(X, Y(1), Y(2), Y(3), Legend(3)), Line(X, Y(1), Y(2), Y(3), Legend(5))),
Local Data Filter(Add Filter(columns(:TrueValue))),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
3,
Base(0, 0, 0, Item ID("TrueSum", 1)),
Base(1, 0, 0, Item ID("NearestSum", 1)),
Base(2, 0, 0, Item ID("EvenSum", 1))
)}
)
)
),
Tabulate(
Show Control Panel(0),
Add Table(Column Table(Statistics(Sum, Mean)), Row Table(Analysis Columns(:TrueValue, :RoundToNearest, :RoundToEven)))
)
),
<< On Close(Try(Close(dt, No Save)))
);