- ベストアンサー
最適な端数処理方法と処理位置を知りたい
1から99,999,999,999までの整数Aと0.01から999,999.99までの小数Bがあり、A÷Bの商Cに再度Bを掛けて得られる積をAと同じ値にしたいです。A÷BとC×Bの算出時に四捨五入等・切り捨て・切り上げのいずれかの処理を行わなければならない場合、両式の小数点第何位でどの処理をすれば結果がAになるでしょうか。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
整数Aを小数Bでわったとき,最も小さくなるのは 1/999999.99=0.0000010000000100000001... であって,これを小数点以下5桁までに丸めたら0.00000になりますから,これに小数Bを掛けて整数Aに戻すことはできません。 しかし小数点以下6桁までに丸めたら0.000001になりますから,これに小数Bを掛けて整数に丸めれば整数Aに戻ります。 結論としては A/Bでは小数点以下6桁までになるように四捨五入をする C*Bでは小数点以下0桁までになるように四捨五入をする です。
その他の回答 (3)
- staratras
- ベストアンサー率41% (1498/3648)
ご質問の趣旨を勘違いしていたようで失礼いたしました。割るときも掛けるときも四捨五入すれば、確かに元に戻せますね。被除数Aが最大12桁の整数、除数Bが最大6桁で小数第2位までなので、商Cは小数第7位を四捨五入して小数第6位まで求めておけばよさそうです。もちろんC×Bは小数第1位を四捨五入して整数に丸めます。 これから先は数学ではなく職場の世間話的蛇足です。場合によっては0.9999999を四捨五入して1.000000に切り上げるのが好まれない場合があります。ご質問はそうではないでしょうけれど、Aが実績値でBが目標値であるようなとき、「目標に僅かとはいえ及ばないのに達成率が100%とは」と言い出すような上司がいる場合です。そのような場合は商を小数第7位までに丸めておく必要があるかもしれません。 例 A=999999、B=999999.1 C=A/B≒0.99999989999991≒1.000000 C≒1.000000 なら D=BC=999999.1 四捨五入して999999 (元に戻る) C≒0.999999 なら D=BC=999998.1… 四捨五入して999998 (元に戻らない) C≒0.9999999 なら D=BC=999999.0… 四捨五入して999999 (元に戻る) -
お礼
ご丁寧にありがとうございます。さらに理解が深まりました。失礼ながら、目標にわずかとはいえ…のくだりは大笑いしました。以後充分留意します。
- staratras
- ベストアンサー率41% (1498/3648)
単純なA=1、B=3の場合を考えてみるだけで、そのようなことは不可能であることがわかります。 A÷B=1/3=0.33333333333… と無限に続きますので、 どこかの桁で切り捨て(この場合は四捨五入も同じ)れば、C=A÷B<1/3 となるのでC×B<1となり、逆にどこかの桁で切り上げれば、C=A÷B>1/3 となるのでC×B>1となります。どの桁で処理しても(四捨五入等・切り捨て・切り上げのいずれかから選ぶ限り)「数学的には」Aには戻りません。 もっとも単純な解決法は、A÷Bの数値を分数のままにしておくことではないかと思います。
お礼
ご回答有難うございます。A÷Bの数値を分数のままにする、とは思い付きませんでした。参考になります。
- myuki1232
- ベストアンサー率57% (97/170)
そのような方法はありません。 四捨五入等・切り捨て・切り上げをしないようにするしかありません。
お礼
早速のご回答ありがとうございます。方法がない、とのことなので許容できる位置を探してみたいと思います。頭が弱いので今の所総当たりで計算することしか思い付きませんが。
お礼
ご回答有難うございます。正に求めていた答でした。素晴らしい。 実は1万ほどのランダムな数で計算をして、f272 さんのお答え辺りではないかとの肌感覚を持っておりましたが、どうやって証明できるか分かりませんでした。感謝します。