質問: 建設業の請求システムを実装しようとしています。 組立時 ○○%, 解体時 ○○% と、複数回請求するのですが、 税込金額の合算が小数点が発生したことにより1円分合わなくなることがあります。 例: ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/1791a3559858e5f4f1b3396c217db2c2.png) これを何とか修正したいのですが、良い計算方法が見つかりません。 この問題は請求関連のシステムではよく起こるものだと思うのですが 皆さんはどう対処されているのでしょうか? 合計のあう計算方法があるのでしたら、ご教授ください。 【追記】 1円の差額が発生しているかをチェックして、あれば組立時に含めるといった 方法もあるかと思いますが、それは最終手段にしようかと思っています。 可能であれば、計算式ですっきりできればありがたいです。 【追記2】 今回の件ですが、社内システムなので融通はかなり効くようになっています。 そのため、組立時は切り上げ、解体時は切り捨てなどこちらで仕様を決めることができます。 私が知りたいこととしては、切り上げ、切捨て、四捨五入を使って下記の式が成り立つ計算方法を探しています。 税込金額=【請求金額】*【消費税】 組立金額=【請求金額】*【組立割合(%)】*【消費税】 解体金額=【請求金額】*【解体割合(%)】*【消費税】 これを請求金額がどのような値でも成り立つ計算方法を探しています。 税込金額=組立金額+解体金額 お手数ですが、お願い致します。
回答: 要件定義で仕様をどのように決めるかに関しては他の人が回答してくださっているので省略するとして、 プログラミングで小数点以下(浮動小数点)を扱うと厳密な値が出ない場合があります。 これは基本的にコンピュータの数値計算が2進法を用いていることに起因する、言語共通の問題です。 (参考:http://dobon.net/vb/dotnet/beginner/floatingpointerror.html) 小数点以下を厳密に計算・積算するのであれば、それに特化したライブラリの使用が求められる場合があります。 計算に使用する言語がjavaであればBigDecimalクラス、phpだと http://php.net/manual/ja/ref.bc.php このあたりでしょうか。 求められている回答に合致しているかわかりませんが、もし計算のずれがこのようなコンピュータ内部の浮動小数点計算に起因しているのであれば、上記のようなクラスライブラリを試してみてください。 ちなみに、javascriptでは全ての数値がNumber(浮動小数点)として扱われるので、javascript側で請求の厳密計算はできません。サーバーで計算したものを文字列で返してそのまま画面に描画するのがベターかと思われます。