Проблема в double.Parse в управляемом C ++

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

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

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

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

result2 = Math::Round(result, 5)

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


person Ashish Ashu    schedule 06.08.2009    source источник


Ответы (3)


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

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

Это связано с точностью. Я дал этот ответ здесь:

Плавающие и двойные числа - это представления чисел с определенной точностью. Не каждое значение может быть представлено в этом формате. См. Также здесь.

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

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

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

person Ralph M. Rickenbach    schedule 06.08.2009

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

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

person Marc Gravell    schedule 06.08.2009