以下代码会生成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);
答案 0 :(得分:1)
浮点数和精确精度不会混合,句点[link]。因此,货币计算绝不应以浮点[link]进行。使用定点算术库,或者只使用整数运算并将其解释为您需要的任何小数部分。由于您的精度要求似乎非常高(小数点很多),因此可能需要大量的库。
虽然库建议在Stack Overflow上是偏离主题的,但this old question似乎提供了一组很好的链接到您可能会觉得有用的库。
答案 1 :(得分:1)
错误输出moneyDouble
的结果是因为moneyDouble
是浮点数。他们不能完全表达十分之一,百分之一,千分之一等。
此外,浮点数实际上是以二进制形式表示的,这意味着只有(某些)二进制数可以精确地以浮点表示。更不用说它们具有有限的精度,因此它们只能存储有限数量的数字(包括小数点后的数字)。
您最好的选择是使用定点算术,整数算术,或实施有理数等级,您可能需要编号库,因为您可能需要以非常高的精度处理非常大的数字。
有关浮点精度意外结果的详细信息,请参阅Is floating point math broken?。