Проблема в двухместном. Parse в Managed C ++ - PullRequest
1 голос
/ 06 августа 2009

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

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

Вывод результата 0.006000000000001. Почему он добавляет 1?

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

result2 = Math::Round(result, 5)

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

Ответы [ 3 ]

3 голосов
/ 06 августа 2009

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

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

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

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

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

0 голосов
/ 06 августа 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...