Assert.AreEqual() с System.Double становится очень запутанным

Описание

Это не реальный пример! Пожалуйста, не предлагайте использовать decimal или что-то еще.

Я спрашиваю об этом только потому, что действительно хочу знать, почему так происходит.

Недавно я снова посмотрел потрясающую веб-передачу Tekpub Mastering C# 4.0 with Jon Skeet.

На эпизоде 7 - Decimals and Floating Points все идет очень странно и даже наш Чак Норрис программирования (он же Jon Skeet) не имеет реального ответа на мой вопрос. Только может быть.

Вопрос: Почему MyTestMethod() провалился, а MyTestMethod2() прошел?

Пример 1

[Test]
public void MyTestMethod()
{
    double d = 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;

    Console.WriteLine("d = " + d);
    Assert.AreEqual(d, 1.0d);
}
В результате получается.

d = 1

Ожидалось: 0.99999999999999989d Но было: 1.0d

Пример 2

[Test]
public void MyTestMethod2()
{
    double d = 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;
    d += 0.1d;

    Console.WriteLine("d = " + d);
    Assert.AreEqual(d, 0.5d);
}
Это приводит к успеху

d = 0,5

Но почему?

Обновление

Почему Assert.AreEqual() не покрывает это?

19
задан Sergey 4 January 2017 в 21:00
поделиться