You said

次のとおりVBAコードを記述するものとします。 Private Function useLong(ByVal lngA As Long, ByVal lngB As Long) As Double Dim bytDigit As Byte: bytDigit = 5 useLong = Int(lngA / lngB * 10 ^ bytDigit) / 10 ^ bytDigit End Function Private Function useDouble(ByVal lngA As Long, ByVal lngB As Long) As Double Dim bytDigit As Byte: bytDigit = 5 Dim dblTemp As Double dblTemp = lngA / lngB useDouble = Int(dblTemp * 10 ^ bytDigit) / 10 ^ bytDigit End Function lngA = 219, lngB = 365を与えた場合に、useLong, useDoubleそれぞれから返ってくる値はいずれも0.6ですか?

Copilot said

VBAコードを確認すると、どちらの関数も lngA / lngB の計算結果を 小数点以下5桁 で丸めて返す処理をしています。

lngA = 219, lngB = 365 を用いて計算すると、

219÷365=0.600000219 \div 365 = 0.600000

この値に対して 10^5 を掛けて整数化し、再び 10^5 で割ることで 小数点以下5桁まで に丸める処理を実施しています。

useLonguseDouble のどちらの関数も同じ丸め処理を行っているため、返ってくる値は 0.60000 となり、どちらも同じ結果になります。

つまり、 useLong と useDouble の返り値はどちらも 0.6 です!

ただし、lngA / lngB の計算において Long 型の変数が使用される場合、型変換の影響で丸め誤差が生じる可能性もあるため、慎重にデータ型を扱うことが推奨されます。Double 型を使う場合のほうが計算精度がより安定することがありますね。

もし他のケースについても検証したい場合は、お知らせください。

Hey, what’s on your mind today?