2012-10-30 41 views
0

我有一些代碼行爲奇怪,似乎是四捨五入的結果增加了兩個值。這是我的代碼造成的問題。雙加法結果被舍入

不幸的是,我不能解決這個問題,因爲我的單元測試環境工作正常(不捨入),我的應用程序不正確(舍入)。

在我的測試環境:

a = -3.7468700408935547 
b = 525218.0 
c = b + a 
c = 525214.25312995911 

在我的應用程序:

a = -3.7468700408935547 
b = 525218.0 
c = b + a 
c = 525214.25 

什麼可導致此?項目配置? (我使用Visual Studio,順便說一句)

編輯(從評論)
我通過使用Visual Studio調試器相同的代碼步進,所以它是完全相同的一段代碼。

我有更多的代碼,但我把問題縮小到這個特定的總和。

每個值的二進制表示是:

測試環境:

System.BitConverter.ToString(System.BitConverter.GetBytes(a)) "00-00-00-00-97-F9-0D-C0" string 
System.BitConverter.ToString(System.BitConverter.GetBytes(b)) "00-00-00-00-44-07-20-41" string 
System.BitConverter.ToString(System.BitConverter.GetBytes(c)) "00-40-9A-81-3C-07-20-41" string 

內部應用:

System.BitConverter.ToString(System.BitConverter.GetBytes(a)) "00-00-00-00-97-F9-0D-C0" string 
System.BitConverter.ToString(System.BitConverter.GetBytes(b)) "00-00-00-00-44-07-20-41" string 
System.BitConverter.ToString(System.BitConverter.GetBytes(c)) "00-00-00-80-3C-07-20-41" string 

編輯2:

作爲Alexei Levenkov指出,日問題是由更改FPU配置的庫引起的。

對於任何人誰是好奇這是什麼意思我: 我能夠緩解這個問題對於我特定的代碼,通過做一些假設,我的輸入值,做四捨五入這反過來又使我有些搶佔值計算一致。

+3

你怎麼知道實際值被四捨五入,而不僅僅是顯示? –

+2

你有一些代碼來「分享」? – lboshuizen

+0

什麼是變量定義爲?由於變量的選擇,「b + a」可能會變成2DP ... – MoonKnight

回答

1

您的應用程序可能會做一些奇怪的事情與FPU的配置。即使用一些隨機數學庫來重新配置精度...

Direct3d是可能的懷疑,見例如Pow implementation for double

2

如果需要預算更新(如財務計算所需),請使用小數。

編輯 參見:

+0

我想到了這一點,但我真的需要這些數據類型提供的速度,唯一的問題是我無法理解使代碼始終工作的環境之間的差異。 –

+0

@JoãoPortela缺乏準確性是爲什麼雙打這樣使用,這是你面臨的折衷。 – OmegaMan

+0

我意識到這一點,但如果我不知道問題出在哪裏,我無法確定我的修復是否正確。這就是這個問題的目的:瞭解問題。 –