Хорошо, я не проверял, что делает Assert.AreEqual
... но я подозреваю, что по умолчанию не применяет какой-либо допуск. Я бы не стал ожидать этого за моей спиной. Итак, давайте посмотрим на другое объяснение ...
Вы в основном видите совпадение - ответ после четырех сложений бывает точным значением, вероятно потому, что младший бит теряется где-то при изменении величины - я не смотрел на бит задействованные шаблоны, но если вы используете DoubleConverter.ToExactString
(мой собственный код), вы можете увидеть точно какое значение в любой точке:
using System;
public class Test
{
public static void Main()
{
double d = 0.1d;
Console.WriteLine("d = " + DoubleConverter.ToExactString(d));
d += 0.1d;
Console.WriteLine("d = " + DoubleConverter.ToExactString(d));
d += 0.1d;
Console.WriteLine("d = " + DoubleConverter.ToExactString(d));
d += 0.1d;
Console.WriteLine("d = " + DoubleConverter.ToExactString(d));
d += 0.1d;
Console.WriteLine("d = " + DoubleConverter.ToExactString(d));
}
}
Результаты (на моей коробке):
d = 0.1000000000000000055511151231257827021181583404541015625
d = 0.200000000000000011102230246251565404236316680908203125
d = 0.3000000000000000444089209850062616169452667236328125
d = 0.40000000000000002220446049250313080847263336181640625
d = 0.5
Теперь, если вы начнете с другого номера, он не будет работать так же:
(начиная с d = 10,1)
d = 10.0999999999999996447286321199499070644378662109375
d = 10.199999999999999289457264239899814128875732421875
d = 10.2999999999999989341858963598497211933135986328125
d = 10.39999999999999857891452847979962825775146484375
d = 10.4999999999999982236431605997495353221893310546875
Так что в основном вам повезло или не повезло с вашим тестом - ошибки исчезли сами собой.