端数処理
丸め誤差を小さく抑えるには、常に最も近い整数(2つある場合はそのうちどちらか)に丸めればいい。これを「最近接丸め (round to the nearest)」という。ただし、単に「最近接丸め」というと、後述する「偶数への丸め」を意味することが多いので注意。
「最近接丸め」では、丸め誤差は最大で0.5で、「切り捨て」「切り上げ」の丸め誤差の半分になる。バイアスも、端数がランダム(すなわち、[0, 1)で一様分布)の場合は発生しない。端数がランダムでなく端数0.5が正の割合で発生する場合のみバイアスが発生するが、それでも、「切り上げ」「切り捨て」より格段に少ない(端数が全て0.5であるようなデータを四捨五入するといったワーストケースでは同じ程度になる)。
端数がちょうど半数だった場合どちらに丸めるかで、いくつかの変種がある。
「偶数への丸め」(round to even)は、端数が0.5より小さいなら「切り捨て」、端数が0.5より大きいならば「切り上げ」、端数がちょうど0.5なら「切り捨て」と「切り上げ」のうち結果が偶数となる方へ丸める(つまり偶数+0.5なら「切り捨て」、奇数+0.5ならば「切り上げ」となる)。JIS Z 8401で規則Aとして定められていて、規則B(四捨五入)より「望ましい」とされている。
端数0.5のデータが有限割合で存在する場合、「四捨五入」ではバイアスが発生するが、「偶数への丸め」ではバイアスが無い。つまり、多数足し合わせても、丸め誤差が特定の側に偏って累積することがない。ただし、偶数+0.5は現れるが奇数+0.5は現れないデータのように分布に特殊な特徴がある場合は、バイアスが発生することがある。
単に「偶数丸め」「最近接丸め」とも呼ばれる。JIS Z 8401で定められていることから「 JISの丸め方」、あるいは同様にISO 31-0で定められていることから「ISO丸め」ともいう。英語では、誤差の累積を嫌い銀行家が好んで使ったため「銀行家の丸め (bankers' rounding)」、「銀行丸め」ともいう。5が切り捨てられたり切り上げられたりするので「五捨五入」と呼ばれたり、端数がちょうど0.5の場合に整数部分が偶数なら「ゼロへの丸め」奇数なら「無限大への丸め」になるので「偶捨奇入」と呼ばれたりもする。
ニュージーランドでは現金での支払いの際、スウェディッシュ・ラウンディングと呼ばれる方法で端数処理が行われている。「スウェディッシュ・ラウンディング」とは、十進法で二捨三入や七捨八入と呼ばれる方法である。
5を単位とした端数が3未満なら切り捨て、3以上なら切り上げとなる。
端数がランダムな場合は、「五捨六入」と同様に非実用的である。しかし通常は、1刻みのデータに対し5を丸め幅として丸めるので、その結果は最近接値への丸めである。
浮動小数点型から整数型へのキャストなどによる型変換では、処理が単純な切り捨てになるものが多く、負の場合は実装による。
C言語のmodf関数は、実数を整数部と小数部に分割する。整数部は0への丸めである。
(以下(§a.b)のようにして示すセクションは JIS X 3010-1993(C89)のもの)
C言語およびそれと同じ仕様の言語では、キャストなどによる浮動小数点型から整数型への型変換においては、その値は小数部が捨てられる(§6.2.1.3)。よって「0への丸め」が行われる。
C89では、数学ライブラリ(§7.5)に床関数floorと天井関数ceilがあり(§7.5.6)、浮動小数点型において正方向への丸めと負方向への丸めが計算できる。
C99では、四捨五入関数roundをはじめとして、fegetround/fesetround(これはmath.hではなくfenv.h)による丸めモードの取得と設定など、大幅な強化が図られている。
なお、浮動小数点演算の性質上、たとえば (int)(0.6/0.2) が 3.0 ではなく 2.0 になることがある。これは、浮動小数点表現では 0.6 や 0.2 を厳密に表現できないため、0.6/0.2 が 2.9999999999999996 のような値になるためである。