- - PR -
490/4.9=99.99999
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-21 00:09
> 四捨五入なら問題ない?
とかいっている人に2進数で4.9を表現してみろとか いってもわかりにくいと思うんだが。 四捨五入しろとか言わないで、 回答者が期待する答えを質問者自ら出すまで、 あらゆる方向からせめてじっくりまつんですか。 結果が真の値より大きい場合もあれば小さい場合もあるから 切り捨てのみや切り上げのみより四捨五入のほうがいいってだけだろ。 | ||||||||||||
|
投稿日時: 2005-11-21 00:47
エンジニアがそれでは困るんではないでしょうか。 少なくとも、私のそばにいて欲しいとは思いません。
siopさんが最終的にどこに行き着くことになるのか、についてはどうでもいいことです。 少なくとも、私にとってはね。
そういうことは、未記入さんが、お客さんからお金をもらってやればいいことです。 ロープウェーで一気に山頂まで行ったとして、それを登山とはいわんでしょ。 ゴンドラから登山客を笑うなんて、行儀が悪いですよ。 <追記> そもそもロープウェーを施設するためには、ロープウェーが無くても、 山頂まで登れる人間が必要で、エンジニアというのは、そういう役割を求められているのでは? [ メッセージ編集済み 編集者: さいくろう 編集日時 2005-11-21 00:52 ] | ||||||||||||
|
投稿日時: 2005-11-21 10:12
プロのプログラマならば、浮動少数点(double)と固定少数点(decimal)の違いを認識して概念を把握することは、必須でしょう。
自分で2進表現できる必要はありませんが、どのようになっているか調べてみましょう。 | ||||||||||||
|
投稿日時: 2005-11-21 10:34
今回の質問のズバっとした回答としては、
「10進数を2進数で完璧に現すことができないから」 になると思います。 2進数とか10進数とかのことは、10年程前に情報処理試験で勉強してから、あまり意識せずにここまで来てました。 意識しないでも問題ないシステムか、どこかにカプセル化されてたのかも知れません。 で、今回の結論としては、こんな感じで捕らえました。 そもそも私の間違いは、消費税の計算結果の端数処理に用いるメソッドを数値変換に用いたことです。 消費税の端数処理は、ユーザー毎に切捨て、切上げが異なりますので、明示的に指定してます。 係数で数値変換での誤差修正は、四捨五入するべきでした。 <結論> ・10進数を2進数で完璧に現すことができない。 ・よって、計算結果に微小な誤差が生じる場合がある。 ・誤差の調整で切捨て、切上げを使うことはできない。有効桁数まで四捨五入するべき。 これでどうでしょうか。 | ||||||||||||
|
投稿日時: 2005-11-21 11:32
ども。
多分、より正確を期すなら、 ・「浮動小数点」や「倍精度小数点」の型では少数を完璧に表すことが出来ない なのではないでしょうか? decimal型の詳しい内容はわかりませんが、該当記事を見る限りだと、小数点部分を、1バイト分ずつ確保しているのではないか?と思われます。 たとえば、doubleならば4.9を100.1111・・・(0.5+0.25+0.125+・・・)という形で保持するのに対して、 decimalでは100.1001・・・(9)と保持しているのではないかと。 こちらなら、循環小数でなければきちんと保持できると思います。 で、解決策としては、消費税レベルであれば、整数部分だけだから結果の小数点部分四捨五入でいいのかな?と。 | ||||||||||||
|
投稿日時: 2005-11-21 12:33
「四捨五入」という言葉自体、十進数ベースの概念ですよね。
ところで、これだけ有効桁数の話とかがでてきながら、これが一回も登場しないのは、皆さんわざとですか? | ||||||||||||
|
投稿日時: 2005-11-21 13:51
「できない」とか「べき」とかは、目的によるのですよ。 「結論」は、手段の選択の結果に過ぎません。 もちろん、当初の目的を満たす必要があります。 「今回の結論」は、siopさんの要件を満たしますか? 「どうでしょうか」ではなくて、お客さんに「○○の理由で、 このような処理方法を採用しました」といえるようにがんばってください。 | ||||||||||||
|
投稿日時: 2005-11-21 16:34
ほぼ全てですか。参考までにあなたが確認された実装を教えていただけませんか? 私が確認した範囲では gcc(mingw) C 標準ライブラリ, T-SQL(SQL Server), PL/SQL(Oracle) が、いわゆる偶数丸めではなく単純な四捨五入という実装になっていました。逆に、偶数丸めを実装していたのは Visual Basic 6.0 や .NET などでした。Java は四捨五入も偶数丸めも指定できました。 偶数丸めが規格化されていることを最近知って嬉しいのかどうか知りませんが「ほぼ全て」と言えるほど実装例は多くないような気がします。規格が存在するからといって、あまりいい加減な事は言わないほうがいいんじゃないですか。 |