1

我正在尝试将仅包含浮点值的 char * 转换为 float 类型,但 sscanf_s 和 atof 都产生相同的无效结果。

char t[] = "2.10";
float aFloat( 0.0f ), bFloat( 0.0f );

sscanf_s( t, "%f", &aFloat );
bFloat = atof( t );

输出:

aFloat: 2.09999990
bFloat: 2.09999990

当我查看类似的问题以试图确定答案时,我尝试了他们的解决方案,但无济于事。

将 char* 转换为 float 或 double

这里给出的解决方案是包含“stdlib.h”,在这样做之后,我将对 atof 的调用更改为显式调用“std::atof”,但仍然没有运气。

4

2 回答 2

3

我看到评论中缺少出色的答案(或者我没有轻易找到它)如何处理它的另一种选择。

你应该写,为什么你需要浮点数。如果您碰巧使用货币金额(而不是太大的金额),您可以创建输入值的自定义解析器和值输出的自定义格式化程序,将其读取为 64b 整数 (*100),并在您的整体中工作具有 100* 金额值的应用程序。如果您处理的金额非常大,请使用一些用于大数字的库,或者您可以创建自己的库,使用 char* 数字。

这是定点算术的一个特例。

如果您对“只是为了解决这个问题”感兴趣,而无需编写太多代码,那么无论如何都要使用大数字库,即使是 *100 定点变体也很容易编写错误 - 如果这是您的第一次并且您没有足够的资源来正确地做到这一点(建议 TDD)。

但一定要了解数字是如何存储在计算机中的,以及为什么 float/double 不能代表所有数字。计算机的浮点数2.1(内部使用以 2 为底)与 human's 的情况类似,如果没有无限位数的小数位(以及==以 10 为底的方式) 1/3,则无法以 10 为底表示。(感谢@tobi303)1.00.99999...


阅读您的新评论后,如果“这对金融应用程序没有很大影响吗?”

回答:不,零影响,没有理智(和专业)的人会使用浮点数或双精度数创建财务应用程序。

于 2016-07-11T16:59:55.217 回答
3

不幸的是,并非所有浮点值都可以以二进制形式显式表示。如果你说你会得到同样的结果

float myValue = 2.10;
于 2016-07-11T16:49:58.810 回答