我知道字符串 2.34 永远不会等于双精度 2.34。无论您尝试了什么库或算法(lexical_cast,atof)。此外,2.3400 不能表示为双精度类型。相反,它将等于 2.3399999999999999 。一点背景 我正在开发一个应用程序,该应用程序使用其 API 将值传递给外部应用程序。将其视为某种交易应用程序。用户可以使用应用程序 API 传递值,也可以直接使用应用程序传递值。现在,当用户直接使用应用程序并且用户在 2.34 中键入时,该值被处理为 2.34,但是当我使用需要双精度作为参数的 API 时,我传递 2.34 并且它传递为 2.339999999999999999,这是不可接受的。我的问题是应用程序将如何处理这个问题,有没有办法存储 2.34000..在双精度中,以便我可以将其传递给 API ?
如果您需要通过需要double
的 API 传递十进制值,但您需要获取确切的值,那么问题并不大:只要您使用不超过 std::numeric_limits<double>::digits10
位数字,您就可以恢复原始十进制值,尽管不一定是相同的表示形式(尾随的小数零将丢失)。为此,您需要将原始十进制字符串转换为最接近的表示形式double
,然后使用合适的算法再次恢复最佳十进制表示形式。C 和 C++ 标准库中的解析和格式化函数将为您正确执行此操作。
请注意,当您想要恢复原始十进制值时,不应尝试对double
值执行任何算术运算:double
算术的结果将使用二进制舍入,并且值不会是最接近的十进制值。但是,只要只传输double
值,就没有问题。
既然你提到"交易应用程序",我将得出结论,这些数字代表货币。如果是这种情况,您可能也在处理固定数量的小数位数。在这种情况下,您可以通过将浮点数乘以 10 ^ number_of_fractional_digits
来缩放浮点数,实质上使它们成为整数值。浮点数可以准确地存储整数值(只要它们不超过浮点类型的范围)。
另一种可能性 - 如果上述假设是正确的 - 是使用二进制编码的小数。
解决浮点精度问题的一种方法是使用制作良好的分数类。您可以自己编写一个代码,也可以使用常用数学库提供的代码。此类类将在内部表示2.34
234/100
,与单个浮点数相比,这将导致更高的内存消耗量。