- ベストアンサー
VBAのlogとintについて
エクセル2007のVBAについての質問です イミディエントウインドウでの出力なのですが ? log(1000)/log(10#) 3 ? int(3) 3 ?int(log(1000)/log(10#)) 2 となります。このような int(log(10^n)/log(10#)) に対する、数学的な計算に対する誤差は、今のところn=3の場合のみで 見受けられるのですが、対処法はあるのでしょうか?よろしくお願いいたし ます。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
■原因など コンピュータ一般に、浮動小数点演算という手法が使われているのですが、計算結果は内部的には限りなく3に近い2の小数として保持されています。このため、計算結果を int 関数で処理すると限りなく3に近い2の小数でも2になってしまうことがあります。 (int 関数は、整数部を返すという動作をします。) int(number) の閾値 ?int(2.9999999999999997) => 2 内部的には、整数部が2として保持されている。(と思われる*) ?int(2.9999999999999998) => 3 内部的には、整数部が3として保持されている。(と思われる*) *厳密には浮動小数点演算の仕様等を確認すればいいのですが、時間の都合的に推測です。 ?2.9 => 2.9 ?2.99 => 2.99 ?2.999 => 2.999 (中略) ?2.99999999999999 => 2.99999999999999 ?2.999999999999995 => 3 ■対策 通常、丸め処理は round 関数を使用します。 ただ、 round 関数の丸め処理は偶数丸め仕様ですので注意してください。(つまり、四捨五入ではありません) ?round(1.25,1) => 1.2 ?round(1.35,1) => 1.4 質問については、下のようにすればいいと思います。 ?round(log(1000#)/log(10#)) => 3 ?int(round(log(1000#)/log(10#))) => 3
お礼
早速のご回答ありがとうございます。 なるほど、roundを使えばよかったのですね。roundの仕様を確認した ところ、許容範囲の出力を得られました。明解な解答をありがとうござい ます。