Как преобразовать строку в удвоение, сохраняя точно такое же число, представленное в строке - PullRequest
0 голосов
/ 19 мая 2018

Приведенный ниже код приведет к moneyDouble = 365.24567874299998, и мне нужно, чтобы оно было точно 365.245678743
. Я не возражаю против установки точности и получения нескольких дополнительных нулей вправо.

Этот номер используется для расчета денежной транзакции, поэтому он должен быть точным.

std::string money ("365.245678743");
std::string::size_type sz;     // alias of size_t

double moneyDouble = std::stod (money,&sz);

Ответы [ 2 ]

0 голосов

Результат вашего ошибочного вывода moneyDouble состоит в том, что moneyDouble - это число с плавающей запятой.Они не могут точно выражать десятые, сотые, тысячные и т. Д.

Кроме того, числа с плавающей запятой действительно выражаются в двоичной форме, а это означает, что только (некоторые) двоичные числа могут быть выражены точно вплавающая запятая.Не говоря уже о том, что они имеют конечную точность, поэтому они могут хранить только ограниченное количество цифр (в том числе после десятичной точки).

Лучше всего использовать арифметику с фиксированной точкой , целочисленная арифметика , или реализуйте класс рациональных чисел , и вам может понадобиться номер библиотеки , так как вам, возможно, придется иметь дело с очень большими числами при очень большихточность.

См. Не работает ли математика с плавающей запятой? для получения дополнительной информации о неожиданных результатах точности с плавающей запятой.

0 голосов
/ 19 мая 2018

Числа с плавающей точкой и точная точность не смешиваются, период [ссылка] .По этой причине денежные расчеты никогда не должны выполняться с плавающей точкой [ссылка] .Используйте арифметическую библиотеку с фиксированной запятой или просто используйте целочисленную арифметику и интерпретируйте ее как любую дробную часть, которая вам нужна.Поскольку ваши требования к точности кажутся очень высокими (много десятичных знаков), может потребоваться большая библиотека чисел.

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

...