なるほどね。誤差が最小になるように丸めるというのは納得。疫学特論の講義で使っているRothman (2001) Epidemiology: An Introductionの第3章のコラム「どこまで丸めるか」に出ている例でいえば,JIS・ISO式ならば1.25は1.2に丸めることになる。もっともこれは,JIS・ISO式が「等差なら偶数に丸める」と決めているからそうなので,「等差なら奇数に丸める」と決めたら,たぶんそれはそれでも成り立つと思う。Rのround()関数はJIS・ISO式だし,ExcelでもVBA関数はJIS・ISO式だが,Excelのワークシート関数のROUNDやOpenOffice.orgのcalcのワークシート関数のROUND(呼び出すときは例えば=ROUND(1.25;1)とする。桁数指定の前がコンマでなくてセミコロンであることに注意)は小学校で習った四捨五入だ。四捨五入だと平均的に大きめに丸められるというのは直感的にわかるが,実用上便利なのは確かだ。他の言語では,例えばPerlの場合は組み込み関数にはroundがないので,
sub round {
my($number) = shift;
return int($number + .5 * ($number <=> 0));
}
みたいなことをするか(桁数指定を入れるのは面倒なので,例えば&round(1.25*10)/10とする),printf("%3.1f¥n",1.25);を使うことになるが,どちらも小学校式の四捨五入になる。もっとも,Math::Roundライブラリにはround(),round_even()とかround_odd()とかround_rand()という関数があって,JIS・ISO式はround_even()に相当する(Math::Round->round_even(2.5)は2を返す。なお,round()は.5を無限大方向に丸めるとあるから小学校式である。例えばMath::Round->round(2.5)は3を返す)。JavaのClass Mathではround関数は0.5を加えてその値を超えない最大の整数をとると定義されているので,小学校式である(リンク先文書によると敢えて“正しい”丸めにはしていないようである)。PHPではJIS・ISO式(.5の上の位が偶数なら切り下げ,奇数なら切り上げ)になっている。.NET FrameworkのMath.RoundメソッドはJIS・ISO方式らしいから,VBでもC#でもC++でもJScriptでも.NET Frameworkのクラスライブラリを使って小数第2位を丸めると1.25は1.2になる。gccでは標準のmathライブラリにroundはないので,通常は0.5を足してfloorを使うかprintfに任せると思われ,その場合は小学校式となる。