Roundでは丸く収まらないという話
数字を丸める・・
と言えば端数を「切捨て」「切上げ」「四捨五入」と
皆さんすぐに考えつくかと思います。
(業界によっては「五捨六入」なんてのもありますが・・・)
「切捨て」や「切上げ」はまあ、使用するツールや言語に
それぞれ対応する命令や関数が用意されているので特に問題もないと思います。
「え!?「四捨五入」なんかRound関数使えばいいじゃない?」
・・・と不勉強な私も少し前まではそう思っていました。
そのお客様では『有効数字3桁で丸めてください』と
印字サンプルをいただきました。
有効数字云々は置いておくとして、
サンプルで頂いた数字をEXCELに入力して
Round関数で検算してみたところ数字の合わないものが見つかりました。
単純な数値を例にすると・・・
計算結果 | EXCEL | サンプル |
1.5 | 2 | 2 |
2.5 | 3 | 2 |
3.5 | 4 | 4 |
4.5 | 5 | 4 |
5.5 | 6 | 6 |
といった状態になります。
(ちなみに2.51はどちらも3になります)
今回使用した販売パッケージでは
数値の丸めにパッケージで用意された関数を使用する事になっており
直接Round命令を記述しているわけではないのですが、
これまでも多数のお客様に導入していただき、何の問題も出ておりません。
丸めたい桁の次の桁を見て5未満なら切捨て
5以上なら切上げてくれますのでEXCELと同じ結果を返してきますし、
一般人が「四捨五入」と聞けばこちらをイメージする人の方が多いと思います。
開発自体はVB.net+Oracleなので
VB.net側でMath.Round()メソッドを使って丸めてみると
サンプルの値が返ってきました。
逆にOracleのSQLでROUND関数を使うとEXCELの値が返ってきます。
「ん!?同一システム内で言語フィールドによって結果が変わるのマズくないか?」
「画面で計算するのと同じことをバッチ処理でSQLで書いたりするぞ!?」
調べてみると・・
「四捨五入」には「算術型」と「銀行型」と呼ばれる2種類があるとの事。
(「銀行型」は他に「JIS丸め」や「偶数丸め」と言った呼ばれ方をするそうです)
「四捨五入」を行う命令や関数の多くはROUNDと記述されるが、
プログラム言語やデータベースで動作が異なります。
算術型(俗にいう四捨五入) :Java・EXCEL関数・SQLServer・Oracle など
銀行型 :C#・VB.net・VBA・MYSQL など
EXCEL上でVBAマクロで使用するROUND関数と
セル上で使用するROUND関数の動きが異なるのは要注意ですね。
一部の言語やデータベースでは同じROUNDの記述のまま、
あるバージョンから動作が変わったりしている事もあるようです。
最後に・・
この業界に限らず次々と新しい理論や技術が発表されますが、
今ある技術や情報であってもまだまだ知らない事だらけです。
何事も当事者にならないと他山の石なんですよね。
とは言え、客先に出向いて仕事の話しかしません・・・ってな訳にもいかない商売です。
打合せの合間の世間話にどんなネタが振られるか分かったものではありません。
与太話だって仕事の内です。
ネット上には多くの先達が詳細な情報を残してくださっていますが、
たまたまこの記事に辿り着くまで私同様に知らなかった貴方。
何かの折に貴方の知識の一助とならんことを願って。
今回も最後までお読みいただき、ありがとうございました。
お問合わせは下記のフォームよりお願いします。
担当者がお返事させていただきます。
==================
「WEBサイト構築」「システム/ソフト開発」
「業務改善・内製化支援」等に関する
お問合わせは、以下のフォームよりお願いします。
担当者がお返事させて頂きます。
ExcelやAccessでお困りのシステム担当者様を支援します!
当社では主に、東海圏(愛知、岐阜、三重、静岡)と、
関西圏(大阪、京都、兵庫、奈良、和歌山)の
中小企業様、零細企業様、個人事業主様、起業家様の
ITやシステム化、業務効率化に関する支援をさせて頂いています。
東海圏と関西圏の中小企業、零細企業、個人事業主、起業家を支援します!