- ベストアンサー
計算結果の違いの理由はなんですか
割り算掛け算を含めた2つの計算式で結果の相違がおきるのはなぜですか。 下記の数式の結果は、異なるのですが、なぜでしょうか。 (1)round(trunc(a*b)*(1/12),0) (2)round(trunc(a*b)*1/12,0)またはround(trunc(a*b)/12,0) 詳細としては、1ヶ月あたりの減価償却費を計算する際に、 round(trunc(期首簿価*償却率)*(1/12),0) という計算結果と、 round(trunc(期首簿価*償却率)*1/12,0)またはround(trunc(期首簿価*償却率)/12,0) では回答が1円ずれが生じます。 なぜでしょうか。 教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
訂正。 計算結果が6646.5になるわけですね。丸めると繰り上がって6647になります。 これが計算誤差で 6646.49999999999999999999999999999 になると、四捨五入の結果が6646になって 1 違う結果となります。 これはどうしようもないので、計算式を書くときは *(1/12)のような書き方をしないように注意するといった手段しかないかもしれません。 どっちにしても、ORACLEなどデータベースでのお金の計算に詳しい人がいるカテゴリにあらためて質問を出すのがいいとおもいます。
その他の回答 (4)
- a-saitoh
- ベストアンサー率30% (524/1722)
そういうことでしたら、ORACLEの専門家に相談した方がいいです。数学のカテゴリではなく。 おそらく、REAL精度で計算されてしまってるのではないかと思います。 データ型としてNUMBERを使うようにしたら、誤差が小数点以下になってroundで隠れるのではないかと。
- a-saitoh
- ベストアンサー率30% (524/1722)
そもそもどういうコンピュータのどういうソフトで計算していますか? 科学技術計算用のソフトでお金を計算させるとこの手のトラブルが起きることがあります。たとえば、倍精度浮動小数点だと15桁くらいしか有効数字がないので、億単位のお金の利子などで銭の桁まで計算させようとすると、正しい結果が出ないとか。 極端な話、C言語でtrunc(a*b)*(1/12) を計算させると、常に答えが0になります。
補足
ありがとうございます。 たとえば、オラクルのオブジェクトブラウザをつかって、実行しました。 下記SQLです。 SELECT 66558 * (1 / 12) ,66558 / 12 FROM DUAL; 回答が2種類でてきます。。。
- yyfront
- ベストアンサー率26% (140/525)
1/12を掛けるのと 12で割るのでは、エクセルでは違う計算になると思います。 割り切れない数字をかけるのは どこかで省略が行われ良くないと思います。
お礼
ありがとうございます。 そうなんですよね・・・・。 でも経理の仕事で使いたいので、エクセル計算が必須だったりします 端数になる部分を四捨五入するか、切り捨てるかで1円のずれが経理上発生してしまうんです。。。
- pasocom
- ベストアンサー率41% (3584/8637)
(期首簿価*償却率)*(1/12) の計算ではまず(1/12)が先に計算され、0.083333・・・という数字になります。この数字がどこかの位で切り捨てられるのではないでしょうか。その結果求められた数字が1円小さくなる。 これに対して(期首簿価*償却率)/12 では、前半のかけ算のあと12で割る、という順序になり、割った数字がROUNDで繰り上がり、1円多くなる。 という推測です。
お礼
ありがとうございます。 切り捨てられるんでしょうか・・・。 でもそうでもない限り、この誤差はおき得ないですよね。 オラクルの計算は、(1/12)なんです。 でも私の計算は、/12で行ったため、1円のずれが生じました・・・。 1円多く税金を払っていたことになります。。。 正しいのはどちらなのでしょうかね。。。
お礼
ありがとうございます! なるほど。 オラクルに聞いたほうがいいですかね。。。 データの型の問題もあるんですね・・・。 早速メタリンクにでも問い合わせてみます! ありがとうございました。