端数処理

端数処理とは



端数処理とは、与えられた数値を、定められた規則に従ってより簡潔な数値に置き換える操作のことです。これは、数値を丸める、あるいは概数化するとも言えます。日常的な計算から、プログラミング、会計処理、科学技術計算まで、幅広い分野で不可欠な操作です。

丸め幅



通常、端数処理では、10の累乗(100、10、1、0.1、0.01など)を丸め幅として用いることが多いです。しかし、丸め幅は必ずしもこれに限らず、様々な値を設定することができます。例えば、5円単位で丸める場合、丸め幅は5となります。

丸めの種類



丸め方には様々な種類があり、それぞれ特徴や用途が異なります。以下に代表的な丸め方について解説します。

切り捨て・切り上げ



切り捨て: 小数点以下を全て0にする丸め方です。常に元の数値よりも小さくなるか、同じ値になります。
0への丸め(RZ): 絶対値を小さくする方向への丸め。正数は切り捨て、負数は切り上げになります。
負の無限大への丸め(RM): 常に元の数値以下になるように丸めます。
切り上げ: 小数点以下が0でない場合に、整数部分を1増やして小数点以下を0にする丸め方です。常に元の数値よりも大きくなるか、同じ値になります。
無限大への丸め(RI): 絶対値を大きくする方向への丸め。正数は切り上げ、負数は切り捨てになります。
正の無限大への丸め(RP): 常に元の数値以上になるように丸めます。

切り捨てや切り上げは、計算が単純である反面、丸め誤差が大きくなりやすいという欠点があります。特に、複数の数値を丸めて合計する際には、誤差が累積する可能性があります。

最近接丸め



最近接丸めは、元の数値に最も近い整数に丸める方法です。丸め誤差を小さく抑えることができるため、多くの場面で用いられます。

四捨五入: 小数点以下が0.5未満なら切り捨て、0.5以上なら切り上げる方法です。一般的に広く使われていますが、端数が0.5の時に常に切り上げるため、わずかに正のバイアスが生じることがあります。
五捨五超入: 小数点以下が0.5以下なら切り捨て、0.5超なら切り上げる方法です。四捨五入とは逆に、わずかに負のバイアスが生じる可能性があります。
偶数への丸め (round to even): 小数点以下が0.5未満なら切り捨て、0.5より大きいなら切り上げ、0.5の場合は結果が偶数になるように丸める方法です。四捨五入に比べて、バイアスが発生しにくく、誤差の累積を抑えることができるため、科学技術計算や金融分野でよく用いられます。
奇数への丸め (round to odd): 偶数への丸めと対象的で、0.5の場合に結果が奇数になるように丸めます。偶数への丸めと同様に、バイアスが発生しにくい特性があります。

実用上の最近接丸め



定義上は最近接丸めではないものの、特定の条件下では最近接丸めと等価になる丸め方があります。

五捨六入: 0.1の整数倍の値を丸める際に、0.5以下を切り捨て、0.6以上を切り上げる方法です。麻雀の得点計算など、特定の分野で用いられます。
四捨六入: 特定の条件化で偶数への丸めとなる丸め方です。
スウェディッシュ・ラウンディング: 5を丸め幅とする場合、端数が3未満なら切り捨て、3以上なら切り上げる方法です。

その他の丸め



乱数丸め: 乱数を用いて、切り上げか切り捨てかを決める方法です。バイアスがなく、ディザリングの一種として使われます。
フォン・ノイマン丸め: 常に奇数側に丸める方法です。二進法では、切り捨てた後にLSBをセットすることで簡単に実現できます。

2回以上の丸めの禁止



同じ数値に対して複数回丸め処理を行うと、誤差が大きくなる可能性があります。例えば、122.51を丸める際に、まず122.5としてから、次に122と丸めると、正しくは123になるはずの数値が122になってしまいます。このような丸めすぎ、あるいは丸めなさすぎを防ぐために、複数回の丸めは避けるべきです。

プログラミングにおける丸め



プログラミング言語では、様々な丸め関数が提供されています。これらの関数は、内部的にはビット操作やFPU(浮動小数点演算ユニット)によって実装されています。通常、丸め幅は1で、それ以外の丸め幅に対しては、丸め前に丸め幅で割り、丸め後に丸め幅を掛けるという処理を行います。

代表的な丸め関数



`floor`: 床関数(負の無限大への丸め)
`ceil` (ceiling): 天井関数(正の無限大への丸め)
`trunc` (truncate, fix): 切り落とし関数(0への丸め)
`round`: 最近接丸め(通常は四捨五入か偶数への丸め)

型変換と丸め



浮動小数点型から整数型への変換は、多くの場合、切り捨てとして処理されます。C言語では、modf関数で実数を整数部と小数部に分割することができます。また、C99規格では、丸めモードの取得や設定、四捨五入関数など、丸めに関する機能が強化されています。

テーブルメーカーのジレンマ



テーブルメーカーのジレンマとは、複雑な計算結果を正しい桁数に丸めることが困難な問題のことです。例えば、y^wのような計算結果を、全ての浮動小数点数の引数に対して正しく丸めるためのコストは、事前には見積もることが難しいとされています。そのため、標準規格では、四則演算や平方根などの基本的な演算については、無限の精度で演算した結果を正しく丸めた結果と一致させることを要求する一方で、より複雑な関数については、必ずしも正確な丸めを保証していません。

建設事業における積算の例



建設事業における積算では、各作業行為(請負工事、委託業務など)によって端数処理の規定が異なります。

数量: 建築数量積算基準では、設計図書から読み取れる設計数量を原則とし、長さはm単位で小数点以下3位を四捨五入します。
計算数値: 計算数値の端数についても、小数点以下3位を四捨五入します。
電子データ: 電子データの場合は、入力時や計算途中で端数処理を行わなくてもよく、最終的な内訳書で端数処理を行います。
単価表: 単価表では、諸雑費を考慮して有効数字に合わせて端数を調整します。内訳書では、1円未満を切り捨てます。

まとめ



端数処理は、数値を扱う上で不可欠な操作です。適切な丸め方を選択することで、誤差を抑え、より正確な結果を得ることができます。この記事では、様々な丸め方や、その用途、注意点について解説しました。端数処理について理解を深め、より効果的に数値を活用しましょう。

脚注



注釈



[注1] ここに注釈を記述。

出典



JIS Z 8401:2019「数値の丸め方」(日本産業標準調査会経済産業省

参考文献



参考文献1
参考文献2

関連項目



統計学
コンピュータの数値
浮動小数点数
固定小数点
正確度と精度
近似
有効数字
量子化

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。