Вот тест (xUnit), который у меня выполняется успешно, и это плохо для меня:
double value1 = 2097151.135;
double value2 = 2097152.135;
double expected1 = 2097151.14;
double expected2 = 2097152.13;
double result1 = Math.Round( value1, 2, MidpointRounding.AwayFromZero );
double result2 = Math.Round( value2, 2, MidpointRounding.AwayFromZero );
Assert.Equal( expected1, result1, 2 );
Assert.Equal( expected2, result2, 2 );
У меня вопрос, почему именно для чисел, начиная с 2_097_152 начинает неверно работать округление, не так, как описано в документации на метод Round()
У меня Visual Studio 2017 + c# + .net core 2.0
Дело в том, что десятичные числа с дробной частью не представимы точно в формате double.
2097151.135 это примерно 2.09715113500000000931322574615*106
2097152.135 это примерно 2.09715213499999977648258209229*106
Поэтому одно округляется в к 2.09715114*106, а второе - к 2.09715113*106 (точнее к их ближайшим представимым в double значениям).
Если вам нужно точное представление для десятичный чисел - используйте decimal.
Если хотите подробностей - почитайте вопрос-ответ Вычисления на числах с плавающей точкой не работают.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости