VB.NET单一数据类型计算问题

VB.NET单一数据类型计算问题,vb.net,vb.net-2010,Vb.net,Vb.net 2010,我想使用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 S

我想使用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字节)。是否有其他数据类型可用于执行简单的分数计算并获得准确的结果?

这与浮点数存储在内存中的方式有关,而单in.Net是单精度浮点数,其精度远低于存储十进制数的十进制数或双精度数

当计算机计算数字时,它只使用二进制分数,而在单精度浮点数中,它们不是很精确

有关更多信息,请参阅


编辑:这里有一些特定于VB.Net的更多信息:

单一和双重数据类型不精确。它们使用浮点方法存储它们的值。浮点使用更少的内存并允许更快的计算,但它们不精确。如果你打算使用它们,那就是你必须接受的权衡。如果精度很重要,那么它们不是您的选择
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))

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

“Decimal消耗更大的空间(16字节)”使用
Decimal
时是否存在内存问题?它不仅需要更大的空间,但它也是其他数据类型(单、双、int)中速度最慢的。但最重要的是,我很好奇为什么对于这样一个简单的计算结果如此不准确。而且,如果你将变量a、b、c改为双倍,它仍然会产生不准确的结果。但是,如果将变量single1、single2、single3更改为double,则会产生正确的结果。为什么?建议阅读:当.Net计算加法、减法、乘法等的结果时,它只能给出精度最低的数据类型的结果。这就是为什么用一个1.25的十进制数乘以一个2的整数,结果只能得到2。谢谢你们的解释。这回答了我的问题=)