我可以将字符串转换为具有最小小数点精度值的浮点数吗?

问题描述 投票:0回答:1

我正在研究从字符串中提取浮点数的东西。我注意到某些值会导致浮点值稍微不准确。关于这个主题的一些研究几乎告诉我:

  • 采用精确的浮点库
  • 也许切换到更大的数据类型(双精度)以获得更广泛的精度
  • 使用基于整数的数学

我宁愿不必执行任何这些操作(尤其是最后一个),而是创建一个函数来“四舍五入”浮点数,直到它与字符串表示形式匹配。我做了一些基本的数学计算,并意识到这确实发生了(至少在我的例子中)。

在我的示例中,我有一个值为

"0.04"
的字符串。当我在其上使用
std::stof()
时,会产生
0.0399999991
值。我必须添加到该浮点值以使其匹配字符串(至少直到我的字符串的小数点)的最小量是
0.0000000019
,因此它会转换为
0.0400000010
。我通过添加直到发生转变来解决这个问题。

是否已经存在对所有浮点数进行此类计算的方法?如果没有,我担心我必须做一个循环才能继续增加

0.0000000001
。但是,我不确定如何以编程方式得出成功结论,因为将
0.0399999991
切换回字符串会再次产生
"0.04"
字符串。

c++ floating-point
1个回答
0
投票

答案取决于您从字符串中提取数字后尝试如何处理这些数字。

如果您想稍后将它们打印出来供人们使用,或者如果您想将它们嵌入到以其他格式写出的其他字符串中,并且如果将值精确地打印为输入很重要,无论如何,那么您可能不想转换为

float
或 double`。 如果不需要对它们进行数学运算,您可能根本不转换为数字类型,而是将它们作为字符串携带。

但是,如果您需要对它们进行一些数学运算,那么使用 C++ 的本机浮点类型之一将是最简单的,除非:它们会遇到这个问题。

您可以通过在末尾打印数字(或将其转换为字符串)并将精度限制在对您的数字合理的范围内来最小化(并且在许多情况下消除)问题。 例如,在您给出的示例中。如果您要使用

打印回号码
std::cout << std::fixed << std::setprecision(2) << f;

(有关此技术的更多信息,请参阅如何在 C++ 中将输出精度设置为小数点后两位?。)

但是你不能重复,通过添加 0.0000000001 或类似的值来“解决”这个问题。 问题不在于

atof
错误地将字符串
"0.04"
转换为浮点值 0.0399999991。 问题是类型
float
double
根本无法准确表示值 0.04。

© www.soinside.com 2019 - 2024. All rights reserved.