• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

VBA司

vba 来源:SlowLearner 7次浏览

似乎是不可思议,这是不是已经有一个答案的问题的重复,但我无法找到问题或答案所以在这里我去…VBA司

在VBA,在即时窗口,如果我输入:

?8/7 我得到的结果是: 1.14285714285714这要是我再乘以7给我一个数字,比8略显不足,即7.99999999999998我的袖珍计算器提供更多小数位,所以它比VBA更好?对? ;-)

但是,如果我添加0.000000000000003的结果1.142...之前,我乘我得到8(其中,顺便说一句,也是不正确的);但我的问题是:

我怎样才能控制答案的精确度相对于为?8/7显示的小数位数的号码吗?

我已经看到这个答案与accuracy of floating points有关,但它是一个不同的问题,它解释了不准确的原因,而我有兴趣获得一些额外的数字。

为此我试图写一个返回双重功能,但它不会返回足够的小数位…例如我希望看到: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 


===========解决方案如下:

图形和科学计算器不是为了速度而构建的。他们可以使用软件实现十进制浮点数来进行计算,而不是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 

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)