以下のロジックをVB4とVB6で実行した際に平均値WK_STR3に差異が出ます
Dim WK_STR As String
Dim WK_STR2 As String
Dim WK_STR3 As String
WK_STR=Text1
WK_STR=Text2
WK_STR3 = Format((((Val(WK_STR2) + Val(WK_STR) * 1000) / 2) / 1000), "#0.000")
具体的には、値A(Text1),B(Text2)に7.955と7.954を入力すると
VB4ではWK_STR3 = 7.954
VB6ではWK_STR3 = 7.955 となります。
小数点第3位が切り捨て?されているようなのですが、
差異が出ない値もあるのです。
例えば、値A(Text1),B(Text2)に2.955と2.954を入力すると
VB4、VB6ともにWK_STR3は2.955で差異は出ません。
FORMAT関数のバグなのでしょうか??
どなたか分かる方お願いします。
今実行環境がないからわからないけど、数値表現じゃなくて数値演算の誤差じゃない?
あと、式で、
>Format(
(
(
(
Val(WK_STR2) + Val(WK_STR) * 1000
) / 2
) / 1000
), "#0.000"
)
ってなってるんだけど…これでいいの?
> WK_STR=Text1
> WK_STR=Text2
……同じ変数に代入されちゃってますけれども。(^_^;)
で。そもそも Format 関数 (VarFormatNumber APIも含む)は、丸めを目的とした関数ではありません。
oleaut32.DLLのバージョンによって、結果が変わる事もありますし。
http://support.microsoft.com/default.aspx?scid=kb;ja;418691
『厳密な』丸め調整が必要なのであれば、切上げ/切捨て/四捨五入などはFormat関数以外の方法で行うようにして下さい。
また、浮動小数点演算の仕様による誤差も考慮してください。
浮動小数点型による演算を行う場合、数式の最適化処理などが原因で、
コンパイルモード(P-Code/ネイティブ)によって、差が生じる事もあります。
http://homepage3.nifty.com/salv/hp-old/03pc/qvb/03vbpg005.htm