2011-07-01 30 views
2

我遇到了一個令我困惑的問題。。網絡服務器之間的網絡舍入/小數點差異

這裏有一點背景知識:我們是在升級asp.net 2.0 Web應用程序到.NET 4到64位服務器的過程。我們爲新老服務器部署了測試應用程序,以確保事情在我們上線之前按預期工作;它們都指向另一臺服務器上的相同數據庫。

這裏的問題:

double totalGross; 
double totalNet = 9999999.00; 
float taxRate = 15.00f; 

totalGross = totalNet * (1 + (taxRate/100)); 

在舊服務器上,totalGross的的ToString()產生:11499998.85

在新服務器上,totalGross的的ToString()產生: 11499998.6115814

目前不知道爲什麼這可能是?後者的值甚至不代表第一個數字是非舍入的?

順便說一句 - 我沒有找到糾正/改進代碼的方法......只是在可能的原因之後才發生這種情況!

更新

我創建了一個控制檯應用程序,並建立了它在x86和x64以及在服務器上運行兩個版本,並將其輸出的兩個不同的數字。所以在使用double時,它確實會在32位和64位之間出現某種精度損失。這令我感到驚訝,因爲'精確度的損失是0.2,這對我來說似乎並不精確,而且有很大的區別?!正如有人提出它可能會更好使用十進制類型(在我的防守不是我寫這樣的代碼:P)

+0

那是很奇怪的文檔浮點平臺問題的筆記,因爲我只是跑兩個64位和32位的機器,代碼都得到了11499998.85。 – Jethro

+1

你確定沒有什麼會突變這些值嗎? –

+0

假設說,如果您要使用更合適的財務計算類型來運行代碼,那麼您會觀察到什麼結果? –

回答

2

我想舊服務器是一個32位的機器?檢查http://msdn.microsoft.com/en-us/library/system.double.aspx,特別是paragrahp浮點值和精度損失。你能強制新服務器運行32位進程嗎,它會改變什麼嗎? 「

+0

[請勿包含簽名或標語](http://stackoverflow.com/faq#signatures)。 –

0

」此外,Double值的算術運算和賦值操作的結果可能因平臺的精度損失而略有不同,例如,賦值Double值的結果可能與32位和64位版本的.NET Framework。「從以下Link

1

正如其他人所說的採取,該平臺可能是罪魁禍首。 但是,我認爲使用Decimal類型可能是一個更好的選擇,並且可能不會遇到與Double相同的問題。 (我所從事的每一個與金融行業有關的項目都使用小數來計算貨幣交易)。有沒有關於十進制http://msdn.microsoft.com/en-us/library/system.decimal.aspx