Вопрос

Я получаю странную проблему при разборе двойного значения в управляемом C ++.Возможно, я делаю что-то не так.Когда я делаю:

double value = 0.006;
result = Math::Parse( value)

Результатом является 0.006000000000001.Почему к нему добавляется 1?

Также, когда я округляю значение до 5 знаков после запятой, происходит сбой.Я делаю:

result2 = Math::Round(result, 5)

Но result2 всегда есть 0.006000000000001.Что я делаю не так?

Это было полезно?

Решение

Это нормально.Эта проблема, вызванная форматом IEEE double - in real 0.006, представлена как приближение бесконечной двоичной дроби.Итак, у вас есть 3 способа -

  • используйте соответствующее форматирование строки для вывода
  • используйте десятичный тип
  • не используйте == для сравнения чисел, вместо этого используйте < или > с постоянной ошибкой, например:(X -0,06) < Ошибка

Другие советы

Это происходит из-за точности.Я дал этот ответ здесь:

Числа с плавающей запятой и удвоения являются числовыми представлениями с определенной точностью.Не каждое значение может быть представлено в этом формате.Видишь здесь также.

Вы можете легко подумать, почему это могло бы быть так и есть:существует неограниченное количество количество номеров только в промежутке (1..1), но значение с плавающей точкой имеет только ограниченное количество битов для представления всех чисел в (-MAXFLOAT..MAXFLOAT).

Более точно выражаясь:в 32-битном целом числе представление существует счетное количество целых чисел, которые должны быть представлены, Но существует бесконечное неисчислимое количество действительных значений, которые не могут быть полностью представлены в ограниченном представление 32 или 64 бит.Следовательно, существует ограничение не только на наивысшее и наименьшее представимое реальное значение, но и на точность.

Итак, почему число, которое содержит мало цифр после плавающей точки затронуто?Потому что представление основано на двоичной системе вместо десятичной, что позволяет легко использовать другие числа представленные затем десятичными.

числа двойной точности по сути являются приближениями и часто имеют хвосты, которые вы не могу избавиться от - то естьнет никакого способа выразить это число более точно.

Вы могли бы получить результаты, более похожие на ваши ожидания, если бы использовали decimal - который все еще является приблизительным, но он использует базу-10, поэтому имеет тенденцию вести себя больше так, как ожидают люди.Но поскольку он не привязан к типу процессора, он работает медленнее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top