Почему этот тест xUnit не проходит? - PullRequest
1 голос
/ 27 августа 2010
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

Ответы [ 2 ]

1 голос
/ 27 августа 2010

При различном порядке операций ошибки двоичного округления с плавающей запятой, по-видимому, распространяются по-разному. Вы можете получить «менее удивительные», но потенциально более медленные результаты с типом Decimal.

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 голосов
/ 27 августа 2010

Йоэ не может видеть это из вашего фрагмента кода, но я вполне уверен, что это как-то связано с тем фактом, что ваши первые строки (проходящие) имеют .0, тогда как у неудачной есть что-то после запятой не равно нулю.

Я уверен, что что-то странное, как 3.2000000001 придет куда-нибудь. Может быть из базы данных?

НТН!
Томас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...