如何将字符串转换为 double 以保持字符串中表示的数字完全相同

How convert string to double keeping the exact same number represented in the string

下面的代码会导致 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);

浮点数和精确精度不能混用,期间 [link]. For this reason, monetary calculations should never be done in floating-point [link]。使用定点算术库,或者只使用整数算术并将其解释为您需要的任何小数部分。由于您的精度要求似乎非常高(很多小数),因此可能需要一个大数库。

虽然图书馆推荐在 Stack Overflow 上是题外话,this old question 似乎提供了一组很好的图书馆链接,您可能会觉得有用。

你错误输出moneyDouble的结果是因为moneyDouble是一个浮点数。他们不能准确地表达十分之一、百分之一、千分之一等。

此外,浮点数实际上是以二进制形式表示的,这意味着只有(部分)二进制数可以用浮点数精确表示。更不用说它们的精度有限,所以它们只能存储有限的数字(包括小数点后的数字)。

最好的办法是使用定点算法整数算法,或实现有理数class,并且您可能需要数字 ,因为您可能需要以非常高的精度处理非常大的数字。

有关浮点精度的意外结果的详细信息,请参阅 Is floating point math broken?