2010-04-09 31 views
1

任何人都可以解釋爲什麼我得到以下結果?System.Decimal輪任務

Dim badDecimal As Decimal = 54.50327999999999 
Dim expectedDecimal As Decimal = CDec("54.50327999999999") 

badDecimal = 54.50328D,while expectedDecimal = 54.50327999999999D。我的理解是badDecimal應該包含expectedDecimal的值(expectedDecimal可以保持正確的值這一事實表明Decimal類型具有保存該值的精度)。

在此先感謝您提供的任何幫助。

+1

我不知道所有的東西VB.NET,但在C#中,你需要後綴數量與M字符號來表示,這是一個小數,否則它是一個雙精度。所以,你是否需要在VB中做同樣的事情,所以實際上,第一行是將一個double值(54.50327999999999的雙重解釋)賦給一個小數,因此在編譯時已經失去了精度? – 2010-04-09 10:29:00

+0

你美麗的男人,這確實是問題!我有種假設,因爲我宣稱var是Decimal類型的,編譯器會推斷這一點。小心重新發布答案,以便我可以將其標記爲soloution? – WiseGuyEh 2010-04-09 10:32:27

+0

轉發評論爲答案在這裏:http://stackoverflow.com/questions/2606610/system-decimal-rounds-on-assignment/2606685#2606685 – 2010-04-09 10:37:46

回答

6

根據這一頁:Decimal Data Type (Visual Basic),你需要用大寫字符D的後綴十進制文本值,否則編譯器會嘗試編譯爲合適的,但不同的數字類型,像IntegerLongDouble等取決於正在使用的常量值。

在你的情況下,代碼基本上看起來像這樣的編譯器:

Dim badDecimal As Decimal = (constant of type System.Double) 

並由此已經在編譯時,常量值失去了它的精度。

只需將代碼改成這樣:

Dim badDecimal As Decimal = 54.50327999999999D 
              ^
              +-- add this 

,並預期它應該工作。

但是,我會厭倦期待兩個變量比較相同,關於StackOverflow關於浮點類型的「問題」有足夠的問題,至少讓我告訴你,你可能在小數點後的第N個小數,足夠小而不能顯示或調試器,但足以使兩個變量比較不同。所以要記住,如果你打算比較它們,典型的方法是從另一個值中減去一個值,取其絕對值,並將其與一些微小的值比較,以表示「我接受一個不同的大,但不是更大「。

即。像這樣:

If Math.Abs(badDecimal - expectedDecimal) < 0.000001 Then 

,而不是這樣的:

If badDecimal = expectedDecimal Then 
+0

我先前的道歉,如果「如果Math.Abs​​ ...」聲明doesn不像在我原來的評論中說過的那樣,我不是那麼流利的VB.NET :) – 2010-04-09 10:37:23

+0

我不確定'decimal'是否爲通常的浮點數的浮點類型! =實際數字問題。 (但是你對這個問題是正確的:給小數點分配一個雙精度值會導致四捨五入。) – Richard 2010-04-09 10:40:50

+0

應該編譯得很好,謝謝你的建議 – WiseGuyEh 2010-04-09 10:41:46

相關問題