どうして?って話があったのでまとめておくかと思った次第。数値の端数処理。ムキーっとなることがあるのです。慎重にというか忘れなければよいだけのこと。
先に、数値丸めにあるある結論
Power Query で数値の四捨五入を特段の指定なく計算した結果はいわゆる 銀行型丸め。なので、Excel ワークシート関数の ROUND 関数 などの"四捨五入"とは異なる。ちなみに、ROUND function - DAXもいわゆる算術型丸めで"四捨五入"。
Number.Round( 1.4 ) = 1
Number.Round( 1.4, 0, RoundingMode.ToEven) = 1
Number.Round( 1.4, 0, RoundingMode.AwayFromZero) = 1
Number.Round( 1.5 ) = 2
Number.Round( 1.5, 0, RoundingMode.ToEven) = 2
Number.Round( 1.5, 0, RoundingMode.AwayFromZero) = 2
Number.Round( 2.4 ) = 2
Number.Round( 2.4, 0, RoundingMode.ToEven) = 2
Number.Round( 2.4, 0, RoundingMode.AwayFromZero) = 2
// チョットチガウ
Number.Round( 2.5 ) = 2
Number.Round( 2.5, 0, RoundingMode.ToEven) = 2
Number.Round( 2.5, 0, RoundingMode.AwayFromZero) = 3
Power Query の数値を丸める関数
丸めの種類はたくさんあるので便利ですよね。と、言ってもすべてを使いこなすイメージは持ち合わせていない。
Number.Round
Number.Round
丸めた数値を返します。桁数と丸めモードを指定できます。
RoundingMode.Type (丸めモード)
RoundingMode.Up
RoundingMode.Down
RoundingMode.AwayFromZero
RoundingMode.TowardZero
RoundingMode.ToEven
中間の値(例えば、丸め桁数 0 で 0.5 とか 0.0)でどのように丸めるか。丸め方を選ぶことができるので必要な結果に合わせて選ぶ感じでしょう。
RoundingMode.ToEven が "最近接丸め(偶数)" で"銀行型丸め"
RoundingMode.AwayFromZero が "最近接丸め(0から遠い方へ)" いわゆる四捨五入
RoundingMode.TowardZero は 0に近い方へって感じでしょうか
RoundingMode.Up と RoundingMode.Down は "方向丸め"だけど切り捨て/切り上げとちょっと違う
そのほか
Number.RoundAwayFromZero
.正の数値の場合は切り上げた結果を返し、負の数値の場合は切り下げた結果を返します。桁数は指定できます。
Number.RoundDown
.次に小さい数値を返します。桁数は指定できます。
Number.RoundTowardZero
正の数値の場合は切り下げた結果を返し、負の数値の場合は切り上げた結果を返します。桁数は指定できます。
Number.RoundUp
次に大きい数値を返します。桁数は指定できます。
let
Source = List.Transform(
{-10 .. 10},
each
[
_Value = _ / 100,
RoundAwayFromZero = Number.RoundAwayFromZero(_Value, 1),
ModeAwayFromZero = Number.Round(_Value, 1, RoundingMode.AwayFromZero),
RoundTowardZero = Number.RoundTowardZero(_Value, 1),
ModeTowardZero = Number.Round(_Value, 1, RoundingMode.TowardZero),
RoundDown = Number.RoundDown(_Value, 1),
ModeDown = Number.Round(_Value, 1, RoundingMode.Down),
RoundUp = Number.RoundUp(_Value, 1),
ModeUp = Number.Round(_Value, 1, RoundingMode.Up),
ModeToEven = Number.Round(_Value, 1, RoundingMode.ToEven)
]
),
Custom1 = Table.FromRecords(Source)
in
Custom1