パワークエリには、数値データの切り上げ、切り捨て、四捨五入を行える「丸め」というコマンドが用意されている。今回は、このコマンドを使って数値データを整数に変換する方法を紹介していこう。コマンドの使い方は簡単であるが、パワークエリならではの数値の扱い方に注意する必要がある。

「丸め」コマンドの使い方

前回の連載では「データ型の変更」により数値を整数化する方法を紹介した。この場合、小数点以下の数値が「四捨五入」されることになる。そうではなく、小数点以下を「切り上げ」や「切り捨て」で処理したいケースもあるだろう。そこで今回は「丸め」コマンドの使い方を紹介していこう。

  • 数値を整数に丸める(切り上げ、切り捨て、四捨五入)

今回も「税抜価格」に1.1を掛け算した「税込価格」のデータを使って具体的な例を紹介していく。

  • 「税込価格」を計算したデータ表

数値を整数化する列を選択し、「変換」タブにある「丸め」コマンドをクリックすると、以下の図のような項目が表示される。

  • 「丸め」コマンドに用意されている項目

この中から「切り捨て」を選択すると、小数点以下を切り捨てた整数に数値データを変換できる。

  • 小数点以下を「切り捨て」した例

同様に、「切り上げ」を選択すると、小数点以下を切り上げした整数に数値データを変換できる。

  • 小数点以下を「切り上げ」した例

どちらも数値の丸め方を選択するだけなので、使い方はすぐに覚えられるだろう。これらの方法で数値データを整数化すると、データ型も「整数」に自動変更される仕組みになっている。

もちろん、四捨五入により数値を整数化することも可能だ。この場合は「丸め」→「四捨五入」を選択すればよい。すると、「小数点以下の桁数」を指定する画面が表示される。整数に丸めるときは、この桁数に「0」を指定すればよい。

  • 「丸め」→「四捨五入」を選択した場合(桁数の指定)

  • 小数点以下を「四捨五入」した例

ただし、この場合は、データ型が「整数」ではなく「10進数」に自動変更されることに注意しなければならない。データ型を「整数」にするには、自分の手でデータ型を変更してあげる必要がある。

桁数に「0」以外の数値を指定した場合は、その桁数まで残すように四捨五入が行われる。たとえば、桁数に「3」を指定すると、小数点以下3桁までの数値データに四捨五入できる(小数点以下4桁目が四捨五入される)。

桁数にマイナスの値を指定することも可能だ。たとえば、桁数に「-2」を指定すると、十の位で四捨五入して、百の位に丸めた数値に変換できる。

  • 桁数に「-2」を指定した四捨五入

上図は、同じ数値が入力されている2つの列のうち、右側の列だけ桁数「-2」で四捨五入した例だ。数値が百単位に丸められていることを確認できるだろう。

「列の追加」タブにある「丸め」コマンド

「丸め」コマンドは「列の追加」タブにも用意されている。こちらも、先ほどと同様の手順で使用することが可能だ。

  • 「列の追加」タブの「丸め」コマンド

「変換」タブの「丸め」コマンドと異なる部分は、丸めた数値が「新しい列」として追加されること。丸める前の数値データ(列)を残しておきたい場合は、こちらのコマンドを使って数値を整数化するとよい。

  • 丸められた数値(切り上げ)

「10進数」のデータ型に含まれる誤差

これまでに解説してきたように、「丸め」コマンドの使い方は特に難しいものではない。ただし、パワークエリならではの数値の扱い方を知らずに作業を進めてしまうと、予想外のトラブルに発展する恐れがある。

先ほどの例を使って詳しく解説していこう。この例では「切り上げ」により数値データを整数化している。ただし、一部に不可思議な挙動が見られる。たとえば、5行目のデータは「税込価格」が1672(1520×1.1)で、それを切り上げした数値は1673となっている。1672はすでに整数なので、本来なら切り上げしても1672のまま何も変化しないはずだ。同様の現象は、6~10行目や15行目でも発生している。

  • 「切り上げ」の結果が不正確なデータ

この現象は、「税込価格」を計算したときの誤差により生じたものとなる。試しに、5行目の「税込価格」を選択してみると、1520×1.1の計算結果が1672.0000000000002と記録されていることを確認できる。

  • 切り上げる前の厳密な数値

この数値を切り上げすると1673になる。よって、「切り上げ」の処理結果も1673になってしまう、という理屈だ。

このようなトラブルを回避するには、丸める前の数値データを「通貨型」に変更してから「切り上げ」などの処理を行う必要がある。

  • データ型を「通貨」に変更してから「切り上げ」

  • 正しく「切り上げ」された数値

その後、必要に応じて、データ型を「整数」に変更してあげればよい。

このように、1.1などの「少数点以下を含む数値」で計算を行うと、目に見えないところで微細な誤差が生じている可能性がある。この計算結果を「切り上げ」したり、「切り捨て」したりすると、その誤差は約1にまで増幅してしまう。

パワークエリを使って数値計算を行うときは、このような点にも十分に注意しておく必要がある。参考までに、それぞれのデータ型について簡単に補足しておこう。

◆整数
小数点以下を含まない「整数」として数値データを扱う。小数点以下が含まれていた場合は、四捨五入により整数化される。計算時の誤差は生じない。

◆10進数
数値データを64ビットの「浮動小数点」として扱う。このため、計算時に微細な誤差が生じる可能性がある。

◆通貨
常に「小数点以下4桁」の数値データとして扱う。小数点以下の5桁目以降は四捨五入される。各セルには小数点以下2桁までの数値が表示される。「10進数」のように計算時に誤差が生じることはない。

マイナスの数値を丸めた場合

続いては、マイナスの数値を整数に丸めたときの挙動について紹介しておこう。マイナスの数値を「切り上げ」した場合は、自身より大きい整数に変換される。逆に、「切り捨て」した場合は、自身より小さい整数に変換される。

  • マイナスの数値の切り捨て/切り上げ/四捨五入

たとえば、-2.41を「切り上げ」すると、-2に変換される。一方、「切り捨て」した場合は、-3に変換される(上図の3行目を参照)。コマンドには「切り捨て」と表示されているが、実際の挙動は“切り下げ”となる。間違えないように注意しておこう。

「銀行丸め」を一般的な四捨五入にするには?

前回の連載でも紹介したように、パワークエリの四捨五入は「銀行丸め」により処理されている。このため、端数がちょうど0.5であった場合は、最も近い偶数に数値が丸められる(下図の2、4、7行目を参照)。

  • 四捨五入された数値データ(銀行丸め)

これを一般的な四捨五入と同じように処理したい場合もあるだろう。この場合は、自分でM言語を書き換えなければならい。その手順を紹介しておこう。

まずは、普通に「丸め」→「四捨五入」を選択して、「銀行丸め」の四捨五入を実行する。続いて、このステップのM言語を確認する。すると、Number.Round()という関数が記述されているのを確認できるはずだ。

  • M言語の記述を確認

この関数は、第1引数に「四捨五入する[列名]」、第2引数に「桁数」、第3引数に「モード」を指定する仕様になっている。一般的な四捨五入にするときは、モードに「2」を指定すればよい。最初は第3引数の指定が省略されているので、半角の「,」と「2」の文字を自分で追加する、というのが実際の作業になる。

  • 第3引数に「2」を追加

すると、一般的な四捨五入と同じように、端数が0.5のときに「切り上げ」が行われるようになる。

  • 四捨五入された数値データ(一般的な四捨五入)

このように、一般的な四捨五入として処理するにはM言語の書き換えが必要となる。忘れないように注意しておこう。

参考までに、関数Number.Round()の第3引数(モード)に指定可能な値を紹介しておこう。ここには0~4の数値を指定することが可能となっている。それぞれの挙動は以下のとおり。

◆関数Number.Round()の第3引数に指定できる値(端数が0.5の場合の処理)
 0 ………… 大きい整数にする
 1 ………… 小さい整数にする
 2 ………… 0から「遠ざける方向」へ丸める
 3 ………… 0に「近づける方向」へ丸める
 4 ………… 最も近い偶数へ丸める(初期値、銀行丸め)

念のため、マイナスの数値を含めた形で、端数が0.5のときの処理結果を紹介しておこう。第3引数(モード)の値に応じて処理結果が変化していることを確認できるだろう。

  • 各モードにおける四捨五入の結果

なお、上記のように処理されるのは、端数がジャスト0.5のときに限った話となる。端数が0.51とか、0.49といった場合は、モードに関係なく、一般的な四捨五入と同じ挙動になる。

さらに参考として、「銀行丸め」の利点についても簡単に紹介しておこう。

たとえば、0.5、1.5、2.5、3.5という4個の数値データがあったとしよう。これらの数値を合計すると8になる。では、これらの数値を普通に四捨五入してから合計すると、どうなるだろうか?

一般的な四捨五入の場合、各数値は1、2、3、4に丸められるので、その合計は10になる。これは本来の合計である8よりも大きな値になる。一方、「銀行丸め」の場合は、各数値が0、2、2、4に丸められるので、その合計は8になり、本来の合計と同じ値になる。

このように端数に0.5が頻発する場合は、それらを四捨五入してから合計すると、本来の合計より大きくなってしまう傾向がある。それを解消してくれるのが「銀行丸め」という手法だ。あくまで理論上の話となるが、このような理由から「銀行丸め」が採用されているケースもある。

いずれにしても、パワークエリで数値を扱うときは、

・計算結果に誤差が含まれている場合がある
・四捨五入は「銀行丸め」が規定になっている

ということを覚えておく必要がある。これらを知らないまま作業を進めると、予想外の結果を招いてしまう恐れがある。「丸め」コマンドの使い方よりも、むしろ「数値の扱い」について学んでおくことの方が重要かもしれない。