比较以下计算结果: Private Sub Form_Load() Dim a As Double a = 10000000 / 29 Debug.Print a Dim b As Currency b = 10000000 / 29 Debug.Print b End Sub
换一个角度看这个问题:Private Sub Form_Load() Dim a As Double Dim b As CurrencyDim i As Integer a = 2.1: b = 2.1 For i = 1 To 48 a = a * 2 b = b * 2 Next Debug.Print a, b End Sub
double的精度是15位有效数字 currency 最高精度19位有效数字 从有效位数来说currency的精度是更高的。但currency设计之初就是为了进行金融货币的计算,并不是为了高精度浮点运算。只要计算结果在他的表示范围内是高精度的,超出4为小数部分不保证。我在10楼的例子就能看出double只能到15位有效数字精度,于是小数点后的那一位被四舍五入了,但是currency却能精确的记录整个结果。9楼的例子呢,用currency得缺点来和double比小数位数。其实只能说明每种变量类型有他自己适应的应用场景,不能如此一概而论。 如果非要和double比小数位数的计算,可以进行一些变换,把9楼的例子改一改: a = 10000000 / 29 Debug.Print a Dim b As Currency '先把被除数放大10^9再做除法 b = 10000000 * 10 ^ 9 / 29 '现在把结果打印出来看看从有效位数上比double结果多了4位, '只需要把小数点往左挪9位就得到比double更高精度的结果了 Debug.Print b
Private Sub Command2_Click() Dim a As Double Dim b As Currency
Dim i As Integer a = 2.1: b = 2.1 For i = 1 To 45 a = a * 2.09 b = b * 2.09 Next Debug.Print a, b '以下是打印结果:为何差这么大呀? '535552646449662 535552446303376.5576 End Sub 以上代码情况下,我发现double型的直实度更高些. 但是没有小数位了,这一点我明白了,将小数位挤没了. 而currency却一直有小数位.但是我不解的是:为何计算结果的真实性,double型是准确的. 这两个数差太大了.
Currency 数据类型在货币计算与定点计算中很有用,在这种场合精度特别重要。
Private Sub Form_Load()
Dim a As Double
a = 1 / 3
a = Format(a, "0.000000000")
Debug.Print a
End Sub
如果需要更高精度就需要自己写算法或者找高精度计算类库了。
比如currency没有误差,但是只能有四位小数,如果位数多,如何办呢?
还可以用string,不过效率上差得多.
Private Sub Form_Load()
Dim a As Double
a = 10000000 / 29
Debug.Print a
Dim b As Currency
b = 10000000 / 29
Debug.Print b
End Sub
换一个角度看这个问题:Private Sub Form_Load()
Dim a As Double
Dim b As CurrencyDim i As Integer
a = 2.1: b = 2.1
For i = 1 To 48
a = a * 2
b = b * 2
Next
Debug.Print a, b
End Sub
为何所有资料上都说currency精度高,用在精度要求极高的场合呢?可是通过测试发现,他的精度不如
double呀,
请大家继续发言。
currency 最高精度19位有效数字
从有效位数来说currency的精度是更高的。但currency设计之初就是为了进行金融货币的计算,并不是为了高精度浮点运算。只要计算结果在他的表示范围内是高精度的,超出4为小数部分不保证。我在10楼的例子就能看出double只能到15位有效数字精度,于是小数点后的那一位被四舍五入了,但是currency却能精确的记录整个结果。9楼的例子呢,用currency得缺点来和double比小数位数。其实只能说明每种变量类型有他自己适应的应用场景,不能如此一概而论。
如果非要和double比小数位数的计算,可以进行一些变换,把9楼的例子改一改:
a = 10000000 / 29
Debug.Print a
Dim b As Currency
'先把被除数放大10^9再做除法
b = 10000000 * 10 ^ 9 / 29
'现在把结果打印出来看看从有效位数上比double结果多了4位,
'只需要把小数点往左挪9位就得到比double更高精度的结果了
Debug.Print b
Dim a As Double
Dim b As Currency
Dim i As Integer
a = 2.1: b = 2.1
For i = 1 To 45
a = a * 2.09
b = b * 2.09
Next
Debug.Print a, b
'以下是打印结果:为何差这么大呀?
'535552646449662 535552446303376.5576
End Sub
以上代码情况下,我发现double型的直实度更高些.
但是没有小数位了,这一点我明白了,将小数位挤没了.
而currency却一直有小数位.但是我不解的是:为何计算结果的真实性,double型是准确的.
这两个数差太大了.