Edited at

Power Query の数値を丸める関数

どうして?って話があったのでまとめておくかと思った次第。数値の端数処理。ムキーっとなることがあるのです。慎重にというか忘れなければよいだけのこと。


先に、数値丸めにあるある結論

Power Query で数値の四捨五入を特段の指定なく計算した結果はいわゆる 銀行型丸め。なので、Excel ワークシート関数の ROUND 関数 などの"四捨五入"とは異なる。ちなみに、ROUND function - DAXもいわゆる算術型丸めで"四捨五入"。


すべてTRUE

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.UpRoundingMode.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


その他