仕事上で、ある2つのシステムで計算した結果を照合した所、元のデータが同じにも関わらず、結果が数円違っているということがありました。
システム関連の人間にとってはよくあることで、大抵それぞれのシステムの数字の丸め方(四捨五入、切り捨て)が違うという結論になるんですが、先日、マイナスの数字の四捨五入の仕方がそれぞれのシステムで違っているために問題が発生しました。
一方のシステムは、数字の絶対値をとってから、四捨五入してマイナスを付加する。
もう一方はプラスマイナスどちらにせよ、四捨五入しろ というプログラム(関数)に投げている。
「マイナスの四捨五入ってなんだ?」
ふと思って調べてみました。
調べてみた・・・
通常四捨五入(小数第一位を四捨五入する場合)といえば、
「1.7」は「2」
「1.3」は「1」
となります。対象の位が5~9であれば切り上げ、0~4は切り下げです。
「切り上げる」というのは、数を大きくすると捉えれば、マイナスの四捨五入について
「-1.7」は一体どうなるのか。数字を大きくするのでは「-1」ではないか。
「-1.3」は「-2」ではないのか。
となると、文字通りの『四捨五入』ではなくなってしまう・・・。
そもそもマイナスの四捨五入なんてないのでは?? 混乱してきました。
調べてみると、jis z8401 という日本工業規格で規定されているようです。
詳細は日本工業標準調査会のこのページでJIS規格番号「Z8401」を検索して下さい。詳細な情報が参照できます。
これによると、負の数は絶対値として丸める(-1.5は-2へと丸められる)そうです。
これで、スッとしました。
コメント
JISを読みもせずに質問を投げかけて申し訳ありません。(JISに回答があるかもしれないのに、・・・)
負の数の四捨五入は、前々からとても気になっていました。負の数は絶対値をとってから丸める。これで解決できればいいのですが、0をまたぐと、妙なことになりそうです。ここでは話を単純に小数点以下第1位までの数として進めていきます。(10倍すると整数になる世界です)
例えば気温のデータを四捨五入で整数値にする場合、丸めて1度なら「0・5~1・4」で、数字10個分です
(0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4)ところが丸めて0度だと「-0・4~+0・4」と9個!
(-0.4, -0.3, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4)同じように四捨五入しておきながら、その範囲が違ってしまうのは、数学的に?大丈夫なのでしょうか。
不等号や等号を使って極限まで「4」に近づけたとしても、どうみても範囲が違うようにみえませんか。
Nを正の整数として、四捨五入とは次の式を満たす N だと思われます。
(N-1)+ 0.5 ≦ N < N + 0.5
ところが、N=0 の場合は、等号が抜けて極限まで行っても範囲が同じになるとは思えません。
(N-1)+ 0.5 < N < N + 0.5 ⇒ -0.5 < N < +0.5
気温の生データの -0.5度は、絶対値をとって「五入」するので、遠くの「丸めて-1度」になってしまいます。
今頃何?と言われそうなほど時間が空いてしまってますが、
EXCEL のROUND UP / ROUND DOWN 関数を負の数に適用すると
まさに、絶対値を相手にして、数直線上で左右対称に処理
している、ということに気付いたのが、このサイト
「マイナス(負の数)の四捨五入ってどうなるのか」に
着陸した背景です。
まずアルフのパパさんがお書きになってることについて:
第2パラグラフ「負の数の四捨五入は…」から、第6パラグラフ
「…どうみて範囲が違うように見えませんか?」は
おっしゃる通りだと思います。ゼロを挟んで左右対称ということに
なると、「四捨五入して0になる小数点第1までの数字」は-0.4 から
+0.4 で9個、同じ四捨五入で1になる数字が10個あるのにくらべると
オカシな感じです。
ただ、第7パラグラフ以降のNを持ち出されてのお話はちょっと
違和感がありました。Nを正の整数と定義(数学では通常Nは
正に正の整数である自然数を表すのに使われていると記憶していますが)
された以上、0.5 を持ち出されるとえっ、整数という以上少数は
話題にならないのでは…と思ってしまいます。
第1パラに書かれている「10倍すると整数になる世界」の
のことを論ずるとすれば、それなりの定義(例えば任意の整数zの
集合をZとした場合、新たな集合Z’:z+0.1 x n,
ただしnは自然数で、1≦n≦10を満たす任意の数)をした上で、
「四捨五入してm、但しmはZに含まれる任意の数と
なるような数とは、(m-1)+0.5≦m<(m+0.5)を満たす
数のことである」
四捨五入をこのように定義すれば、
0.1の整数倍がこの集合のメンバーですから、不連続、
数は常に数えられます。それはm=0 の場合でも同じで、
端的に常に10個です。
しかし、アルフのパパが書かれたように、
「現実の」四捨五入の定義は、
「四捨五入してm、但しmはZに含まれる任意の数と
なるような数とは、
1) m>0 の場合(|m|-1)+0.5≦|m|<(|m|+0.5)を満たす数
2) m=0 の場合(m-1)+0.5<m<(m+0.5)を満たす数
である。
という定義になっている、ということですね。
このように場合分けが必要になるのは
数学的にはあまりスマートではないような気がしますが
如何でしょうか。
ところで、JIS についてですが、
JIS規格は本年 2020年12月2日から制度が変わって
(原則無料ながら)氏名・住所等を登録しないと
閲覧できないことになったとのこと。
めげずに「個人」として登録してようやく閲覧画面に
辿り着きましたが、「著作権の関係で」このページは
有料、と。
ふざけるな、と言いたい。
大原則、「著作権の関係で海外からの閲覧は出来ません」も
そうですが、こんなことやってるから、JIS を国際的に
広く使って貰えない。日本国・日本国民の損になるのに
そこに気付かない官僚的発想の硬直性に呆れました。
さて、話を本題に戻しますが、数直線上の数の「大小」を
一方通行で、左は小さい、右は大きいと考えるか、
原点0を中心に左右対称に、原点からの距離が大きいほど
大きいと考えるか、だということですね。
精々四則演算、開平・開立ももはや計算法は思い出せないような
日常生活に身を浸して50年近く経つと、数の大小の識別は、
上記で言えば一方通行、電車道の方が馴染みます。
皆さん如何でしょうか。