VBA整数分部

时间:2017-12-03 09:48:04

标签: vba

这似乎不太可能,这不是一个已经有答案的问题的重复,但我找不到那个问题或答案所以我在这里...

在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

1 个答案:

答案 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