VBA司

2017-12-03 110 views
2

似乎是不可思議,這是不是已經有一個答案的問題的重複,但我無法找到問題或答案所以在這裏我去...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 
+1

的[?爲什麼是浮點數不準確(可能的複製https://stackoverflow.com/questions/21895756/why - 浮點數 - 不準確) –

+0

有'Variant'的'Decimal'子類型。 –

+1

見[SO:比較在VBA精度問題雙(https://stackoverflow.com/questions/235409/compare-double-in-vba-precision-problem)和[比較浮點數,2012版(HTTPS: //randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/)和[Wikipedia:Microsoft Excel中的數字精確度](https://en.wikipedia。org/wiki/Numeric_precision_in_Microsoft_Excel)...我很好奇你在做什麼,15個精度點是不夠的? – ashleedawg

回答

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 
+0

謝謝你 - 我不知道亞型,抽出時間來解釋的東西,你做的方式十分讚賞。這一切都有道理,歡呼 – SlowLearner