2009-08-06 50 views
1

在解析託管C++中的double值時,我遇到了一個奇怪的問題。這可能是我做錯了事。當我這樣做時:Managed C++中的double.Parse問題

double value = 0.006; 
result = Math::Parse(value) 

結果的輸出是0.006000000000001。爲什麼要附加1?

此外,當我將值舍入到5位小數時,它失敗。我做:

result2 = Math::Round(result, 5) 

result2總是0.006000000000001。我究竟做錯了什麼?

回答

0

這是正常的。由雙倍實際值0.006的IEEE格式引起的這個問題表示爲無限分數的近似值。 所以,你有3種方式 -

  • 使用相應的字符串格式化輸出
  • 使用十進制類型
  • 不要用==以恆定的錯誤,如比較數字,而是使用<或>:( X -0.06)<錯誤
3

這是由於精度。我給了這個答案here

和雙精度浮點數是數 表示具有一定 精度。不是每個值都可以是以這種格式表示的 。同樣見 here

你可以很容易想到的爲什麼會 是這樣的:有剛剛在INTERVALL (1..1)無限 數數,而是一個浮動只具有有限 數位來表示的(-MAXFLOAT..MAXFLOAT)中的所有 數字。

更恰當地說:在32位整數 表示有一個可數 數量的整數來表示, 但就是不能 在有限 表示完全代表實際價值的無限無數 號32或64位。 因此,不僅有 的最高和最低可表示 的實際價值的限制,而且還有準確性。

那麼爲什麼一個數字在浮點數 受影響後幾乎沒有 數字?因爲代表 是基於一個二進制系統而不是 一個小數,使其他數字很容易 代表小數。

0

雙精度數基本上是近似的,並且經常有問題,你無法擺脫的尾巴 - 即沒有更準確地表達數量的方式。

如果您使用decimal - 這仍然是近似值,但它使用的是基數爲10,所以您可能會得到更像您期望的結果,因此趨向於更像人們的預期。但是因爲它沒有映射到CPU類型,所以速度較慢。