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 是单精度浮点数,在存储十进制数时比 Decimal 或 Double 准确得多。

当计算机计算您的数字时,它只能使用二进制分数,并且在单精度浮点数中,它们不是很准确。

有关详细信息,请参阅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

和数据类型不精确SingleDouble他们使用浮点方法来存储他们的值。浮点使用较少的内存并允许更快的计算,但它们不精确。如果您要使用它们,这是您必须接受的权衡。如果精度很重要,那么它们不是您的选择。 Decimal是精确的(即到一定数量的小数位数),所以通常,在大多数情况下,这是精确小数的最佳选择。如果您确实需要节省内存,并且可以保证您的数字在一定范围内,那么您可以使用Int16, Int32, 或Int64代替。例如,如果您只关心两位小数,您可以简单地将所有内容乘以 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 回答
0

您可以改用Decimal数据类型。它会很好用!这是因为Decimal是定点值,而SingleDouble是浮点值(精度损失)。

于 2012-11-15T15:16:30.533 回答