2016-08-11 9 views
1

テキストボックスの値をインクリメントするときにコードが有効数字を保持していない理由がわかりません。vbaのテキストボックスの値を増やしても均等にキャンセルされない

私は、スピンコントロール(テキストボックスと2つの小さなコマンドボタンを使用して、テキストボックスの値を上下に移動できます)をフォーム上に持っています。

テキストボックスのデフォルト値はゼロです。

上矢印コマンドボタンは、テキストボックスの値を+ 0.1だけ増やす必要があります。コードは次のとおりです。

下矢印コマンドボタンは、テキストボックスの値を-0.1だけインクリメントする必要があります。ここでは、コードは次のようになります。

Private Sub cmdIndexSpinDown_Click() 
If Me!txtIndexSpin <= -1.5 Then 
    MsgBox "The minimum Index adjustment has been reached." 
    Exit Sub 
Else 
    Me!txtIndexSpin = Me!txtIndexSpin - 0.1 
End If 
End Sub 

だから私は、私はかつて一度ダウンスピンアップあればデフォルト値の0から、私は正常に動作し0に戻る必要があることを期待します。 2回スピンアップして2回スピンアップすると、テキストボックスの値が0ではなく2.77555756156289E-17になります。

さらにテストした後、クリック数に基づいて一貫して発生するわけではありませんが、クリック間の時間。より迅速に、このエラーが発生しやすくなります。

これがどうして起こりますか?

私は何も間違っているとは思えないので、私はそれをコードするつもりですが、私が何が欠けているのか不思議です。

+2

これは[浮動小数点数学は壊れていますか?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken)と似ていますが、それが重複しているかどうかはわかりませんしかし、。何がもっと必要ですか? – HansUp

+1

他の人が指摘しているように、これは浮動小数点数学の問題です。通貨または小数点データ型(http://stackoverflow.com/documentation/vba/3418/data-types-and-limits)を使用してこれを避けると、10進数の精度が上がり、丸めの可能性が実際には回避されますエラー。彼らは計算上いくぶん遅いことに注意してください。 – Mikegrann

+0

@HansUpそれはトリックでした。私はちょうど今これを学んでいる恥ずべきです! @ChristopherD。 – MoondogsMaDawg

答えて

3

@HansUpは、浮動小数点数は正確ではないことを示しています。 Source。あなたが使用できる簡単な解決策は、テキストボックスに入れる前に数字をroundにすることです。

例:

Private Sub cmdIndexSpinDown_Click() 
    Dim value As Double 
    value = Me!txtIndexSpin 
    If value <= -1.5 Then 
     MsgBox "The minimum Index adjustment has been reached." 
     Exit Sub 
    Else 
     value = Round(value - 0.1, 1) 
     Me!txtIndexSpin = value 
    End If 
End Sub 

Private Sub cmdIndexSpinUp_Click() 
    Dim value As Double 
    value = Me!txtIndexSpin 
    If value >= 1.5 Then 
     MsgBox "The maximum Index adjustment has been reached." 
     Exit Sub 
    Else 
     value = Round(value + 0.1,1) 
     Me!txtIndexSpin = value 
    End If 
End Sub 
1

Round()は、あなたの浮動小数点精度の問題のための合理的な解決策です。そしてそれはまさにあなたが望むものかもしれません。ただし、「バンカーの丸め」を使用することにも注意してください。だから、あなたは小数点以下第三位が5のとき、小数第1位に丸めるから期待得られない可能性があります:

? Round(1.15, 1) 
1.2 
? Round(1.25, 1) 
1.2 

それはあなたが望むものではない場合、あなたは異なる丸め戦略を使用することができます。または、浮動小数点数の代わりに整数の数学に切り替えることができます。そして、浮動小数点の精度の問題がなくなります。それは難しいかもしれませんが、実装するのは実際に簡単です。 txtIndexSpinは、フォームのレコードソースのフィールドにバインドされている場合は、フォームの現在のイベントからtxtHiddenをロードすることができ

Private Sub cmdIndexSpinDown_Click() 
    With Me!txtHidden 
     If .Value <= -15 Then 
      MsgBox "The minimum Index adjustment has been reached." 
     Else 
      .Value = .Value - 1 
      Me!txtIndexSpin.Value = .Value/10 
     End If 
    End With 
End Sub 

...あなたのフォームに隠しテキストボックスを追加し、このようにそれを使用します。

Me!txtHidden.Value = Me!txtIndexSpin.Value * 10 

また、(コマンドボタンだけでなく)直接txtIndexSpinを編集できるようにした場合は、更新後のイベントから再度txtIndexSpinを編集できます。

関連する問題