2017-09-15 19 views
0

誰かが私に次のことを説明できますか?予期しない丸め誤差

Sub TestCalc() 
    Dim Z As Double 
    Dim Y As Double 
    Dim X As Integer 
    Dim W As Double 
    Dim V As Double 
    X = 44/14       ' returns 3 
    Z = (0.14 * 14)      ' returns 1.96 
    Y = ((44/14) - (44 \ 14)) * 14 ' returns 2 SHOULD RETURN 1.96 
    W = (44/14) - X     ' returns 0.142857142857143 
    V = W * 14       ' returns 2 SHOULD RETURN 1.96 
End Sub 

1.96は私がコードから得る価値です。しかし、ハードコーディングされた値を使用する場合にのみ、この値が得られます。変数を使って作業すると、変数は切り上げられ、値2(YまたはV)が返されます。なぜ私は返されると期待される値である1.96を理解する必要があります。私は、この計算を正しく実行して、自分の計算式が自分のメインプロシージャで正しく機能するようにする必要があります。

+1

「1.96」はどこにありますか? 'V?'。より具体的にしてください。 – UGP

+0

@UGP変数YまたはVのどちらかの最終的な値が、返される値2の代わりに1.96を返すことが予想されます –

答えて

3

あなたの期待は間違っています。

0.14 * 14 = 1.96;ただし、Wは0.142857142857143 - その値は* 14 = 2です。

0

入力した数値が整数または倍数として計算されているかどうかを判断するための目に見えない条件がいくつかあります。 Yを Y = ((44.0/14.0) - (44.0 \ 14.0)) * 14.0 と入力した場合、またはVisual Basicでdoubleを指定するとどうなりますか。

また、この記事の末尾には、安全でない変換が発生したときに警告するモードが記載されています。 https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/operators-and-expressions/arithmetic-operators

+0

変数が明示的にdoubleとして定義されています。私はまたそれらを変種に設定しようとしましたが、それは違いはありません。 –