2010-08-27 120 views
1
Assert.Equal(1000000.0, table.Convert("g", "mcg", 1.0)); // Pass 
Assert.Equal(2000000.0, table.Convert("g", "mcg", 2.0)); // Pass 
Assert.Equal(3200000.0, table.Convert("g", "mcg", 3.2)); // Fail 
// The failing one is equal to doing the following calculation, which fails also: 
Assert.Equal(3200000.0, 3.2 * 1.0/(1.0/1000000.0)); // Fail 
Assert.Equal(3200000.0, 3.2 * (1.0/(1.0/1000000.0)));// Pass, WTF?!?! 
===================================================================  
Assert.Equal() Failure 
    Expected: 3200000 
    Actual: 3200000 
+0

Table.Convert的代碼在哪裏?什麼是數據類型?你可能使用Double或Float,因爲平等是棘手的。 – JasonTrue 2010-08-27 15:20:29

+0

好點。增加了計算,這也失敗了。我使用'雙'。 – randomguy 2010-08-27 15:24:28

回答

1

隨着操作順序的不同,浮點二進制舍入錯誤似乎以不同方式傳播。您可以得到「不太令人驚訝」的結果,但十進制類型的結果可能會較慢。

3.2 * 1.0 /(1.0/1000000.0) - > 3200000.0000000005

(試行(3.2 * 1.0/(1.0/1000000.0)).ToString("R");

3.2 *(1.0 /(1.0/1000000.0)) - > 3200000.0

如果你不這樣做已經明白浮點和十進制類型之間的差異,請閱讀:http://docs.sun.com/source/806-3568/ncg_goldberg.html

或者,如果你在青白英語喜歡的東西: http://floating-point-gui.de/

0

Yoe無法從您的代碼片段中看到它,但我確信它與您的第一行(傳遞的行)有.0這一事實有關,而失敗的行有一些事情逗號後不等於零。

我敢肯定有一些奇怪的東西像3.2000000001來某處。也許從數據庫?

HTH!
Thomas