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

时间:2018-05-19 17:24:58

标签: string c++11 double converter precision

以下代码会生成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 :(得分:1)

浮点数和精确精度不会混合,句点[link]。因此,货币计算绝不应以浮点[link]进行。使用定点算术库,或者只使用整数运算并将其解释为您需要的任何小数部分。由于您的精度要求似乎非常高(小数点很多),因此可能需要大量的库。

虽然库建议在Stack Overflow上是偏离主题的,但this old question似乎提供了一组很好的链接到您可能会觉得有用的库。

答案 1 :(得分:1)

错误输出moneyDouble的结果是因为moneyDouble是浮点数。他们不能完全表达十分之一,百分之一,千分之一等。

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

您最好的选择是使用定点算术整数算术,或实施有理数等级,您可能需要编号,因为您可能需要以非常高的精度处理非常大的数字。

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