我想使用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字节)。是否有任何替代数据类型可用于执行具有准确结果的简单分数计算?
答案 0 :(得分:4)
这与浮点数存储在内存中的方式有关,而.Net中的Single是单精度浮点数,与十进制数或双精度浮点数相比,存储十进制数的精度要低得多。
当计算机计算你的数字时,它只有二进制分数才能使用,而且在单精度浮点数中,它们不是很准确。
有关详细信息,请参阅http://en.wikipedia.org/wiki/Single-precision_floating-point_format。
编辑:这里有一些特定于VB.Net的信息:http://msdn.microsoft.com/en-us/library/ae382yt8(v=vs.110).aspx
答案 1 :(得分:0)
Single
和Double
数据类型不准确。他们使用浮点方法来存储它们的值。浮点使用较少的内存并允许更快的计算,但它们是不精确的。如果您打算使用它们,那么您必须接受这种权衡。如果精度很重要,那么它们不适合您。 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))
答案 2 :(得分:0)
您可以改用Decimal
数据类型。它会很棒!这是因为Decimal
是固定点值,而Single
和Double
是浮点值(精度损失)。