подробное объяснение задачи точности размножения двойной точности в .NET
] в C#, результат выражения Double i = 10 * 0,69;
является то, что i
назначено значение 6,8999999999999999999999999999999995, а не ожидаемых 6.9. Это поднимает вопрос: есть ли ошибка в двойной точке умножения в .net?
двоичное представление и операция плавающей запятой
]]]Чтобы понять это поведение, вы должны иметь глубокое понимание тонкостей двоичных представлений и операций с плавающей запятой. Форматы с плавающей запятой приблизительно представляют собой реальные числа как конечные бинарные значения, что может привести к точным ограничениям.
, казалось бы, простой 0,69 не может быть точно представлен в двоичном. Это требует бесконечной петли бинарных чисел. Двоичное представление, хранящееся в типе данных double
, является приблизительным значением 0,69.
константы оптимизированы и хранятся компилятором
]]]В приведенном фрагменте кода компилятор оптимизирует выражение, выполняя умножение и сохраняя результат в качестве постоянной в исполняемом файле. Это происходит потому, что эти значения известны во время компиляции. Хранитованное значение представляет собой приближение с плавающей запятой 6,9, которое немного меньше фактического значения.
решения и альтернативные типы данных
]] Чтобы решить эту проблему и получить более точные результаты, можно использовать более точные результаты Decimal
тип данных, который предназначен для представления неконтролируемых десятичных значений с более высокой точностью. Выражение Decimal i = 10m * 0,69m;
даст результат 6,9 м.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3