3

vb.netを使用して小数で基本的な計算を実行したいと思います。

Dim a As Single= 7200.5
Dim b As Single= 7150.3
Dim c As Single= a - b

'Expected result = 50.2
MsgBox(a.ToString + " - " + b.ToString + " = " + c.ToString.Trim)
'Produced result is: 50.2002

Dim single1 As Single
Dim single2 As Single
Dim single3 As Single

single1 = 425000
single2 = 352922.2
single3 = single1 - single2

'Expected result is: 72077.8
MsgBox(single3.ToString)
'Produced result is: 72077.81

このような単純な計算では、どうして結果がそれほど不正確になるのでしょうか。データ型をに変更すると問題は解決しますDecimalが、Decimalオブジェクトはより多くのメモリ(16バイト)を消費します。正確な結果で単純な分数計算を実行するために使用できる代替データ型はありますか?

4

3 に答える 3

5

これは、浮動小数点数がメモリに格納される方法と関係があり、.NetのSingleは単精度浮動小数点数であり、10進数またはDoubleよりもはるかに精度が低くなります。

コンピューターが数値を計算するとき、使用する2進数のみがあり、単精度浮動小数点数では、あまり正確ではありません。

詳細については、 http://en.wikipedia.org/wiki/Single-precision_floating-point_formatを参照してください。

編集:ここにVB.Netに固有のいくつかの詳細情報があります:http://msdn.microsoft.com/en-us/library/ae382yt8(v = vs.110).aspx

于 2012-11-15T14:22:19.750 に答える
0

Decimal代わりにデータ型を使用できます。それはうまくいくでしょう!これは、Decimalが固定小数点値であるのに対し、SingleDoubleは浮動小数点値であるためです(精度が低下します)。

于 2012-11-15T15:16:30.533 に答える
0

およびデータ型は正確ではありませんSingleDouble浮動小数点法を使用して値を格納します。フローティングポイントはより少ないメモリを使用し、より高速な計算を可能にしますが、それらは不正確です。これは、それらを使用する場合に受け入れる必要のあるトレードオフです。精度が重要な場合、それらはあなたの選択肢ではありません。 Decimalは正確です(つまり、特定の小数桁まで)。したがって、通常、ほとんどの場合、これが正確な小数の最良の選択です。本当にメモリを節約する必要があり、数値が特定の範囲内にあることが保証されている場合は、、、、またはの代わりに使用Int16できInt32ますInt64。たとえば、小数桁が2桁しかない場合は、すべてを100で乗算してから、100で除算するだけです(Decimal分割のタイプ)を表示する前に。このようにして、より少ないメモリを使用して多くの数値を格納し、多くの操作を実行できます。結果を表示する必要がある場合にのみ、Decimalデータ型を使用する必要があります。

Dim a As Integer = 720050 '7200.5
Dim b As Integer = 715030 '7150.3
Dim c As Integer = a - b
Dim cDisplay As Decimal = CDec(c) / CDec(100)
MessageBox.Display(String.Format("{0} - {1} = {2}", a, b, c))
于 2012-11-15T14:41:19.743 に答える