这似乎不太可能,这不是一个已经有答案的问题的重复,但我找不到那个问题或答案所以我在这里...
在VBA中,在即时窗口中,如果我输入:
?8/7
我得到了结果:
1.14285714285714
如果我再乘以7
,我会得到一个略低于8的数字,即7.99999999999998
。 我的袖珍计算器提供更多的小数位,所以它比VBA更好?对吗?; - )
但是,如果我在乘以之前将0.000000000000003
添加到结果1.142...
,我会得到8
(顺便说一下,这也是不正确的);但我的问题是:
如何根据?8/7
显示的小数位数来控制答案的精确度?
我已经看到了与accuracy of floating points有关的答案,但这是一个不同的问题,它解释了不准确的原因,而我有兴趣获得一些额外的数字。
为此,我尝试编写一个返回double的函数但它没有返回足够的小数位...例如我想看到:1.142857142857142857
。我还发现了对decimal
数据类型的引用,但我认为这篇文章适用于VB6(而不是VBA),我认为我已经用尽了VBA中可用的数据类型......我缺少什么?
Function test() As Double
Dim a As Double
Dim b As Double
Dim c As Double
a = 8
b = 7
c = a / b
test = c
End Function
答案 0 :(得分:3)
图形和科学计算器不是为了速度而构建的。他们可以负担得起使用十进制浮点数的软件实现来计算而不是IEEE双精度数。因此,您的袖珍计算器很可能比VBA具有更高的精度,但需要付出代价。他们所做的事情可能会慢一个数量级。
VBA缺少内置的任意精度浮点库,但其decimal type支持的精度高于双精度。不幸的是,它不是一个成熟的数据类型,而是Variant
的子类型。要创建它们,您需要使用CDec()
:
Sub test()
Dim x As Variant
x = CDec(8) / 7
Debug.Print x
End Sub
这会显示1.1428571428571428571428571429
使用Decimal
时,您需要注意这样一个事实:如果您不小心,他们可以回到例如Double
取决于您如何使用它们:
Sub test2()
Dim x As Variant
x = CDec(x)
Debug.Print TypeName(x)
x = 8 / 7
Debug.Print x
Debug.Print TypeName(x)
End Sub
输出:
Decimal
1.14285714285714
Double