Странность округления double (c#, .net-core)

194
01 апреля 2018, 17:07

Вот тест (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

Answer 1

Дело в том, что десятичные числа с дробной частью не представимы точно в формате double.

2097151.135 это примерно 2.09715113500000000931322574615*106

2097152.135 это примерно 2.09715213499999977648258209229*106

Поэтому одно округляется в к 2.09715114*106, а второе - к 2.09715113*106 (точнее к их ближайшим представимым в double значениям).

Если вам нужно точное представление для десятичный чисел - используйте decimal.

Если хотите подробностей - почитайте вопрос-ответ Вычисления на числах с плавающей точкой не работают.

READ ALSO
Тестирование интерфейса Xamarin.iOS приложения

Тестирование интерфейса Xamarin.iOS приложения

Помогите разобратся с вопросов - как тестировать интерфейсы кросплатформенных приложений на Xamarin под iOS? Есть XamarinForms решение

199
Как сделать наследника класса?

Как сделать наследника класса?

Не получается сделать наследника класса:

202
Расширение для Chrome. Создание нового таба при клике на иконку расширения

Расширение для Chrome. Создание нового таба при клике на иконку расширения

Делаю расширение для ChromeХочу сделать так, чтобы при клике на иконку приложения справа, открывался новый таб с url "http://localhost"

217
Запись, хранение и чтение данных в файле Node.JS

Запись, хранение и чтение данных в файле Node.JS

Здравствуйте! Подскажите пожалуйста, как можно хранить данные пользователей в файле(не используя бд), например:

231