【发布时间】:2022-01-09 11:38:48
【问题描述】:
我有以下 C 代码来确定双精度值的小数位。它使用sprintf() 的%f 来结束一个没有浮点不精确的字符串。 sprintf() 是否存在无法正确消除浮点不精确性的风险,或者该函数是否可以安全使用?
#include <stdio.h>
#include <stdbool.h>
#define MAX_STRING 256
int getDecimalPlaces(double n)
{
char string[MAX_STRING];
int numberOfDecimalPlaces = 0;
int i = sprintf(string, "%f", n);
bool countZero = false;
for (int j = i - 1; j > 0; j--)
{
if (string[j] == '.')
break;
if (!countZero && string[j] != 48)
countZero = true;
if (countZero)
numberOfDecimalPlaces++;
}
return numberOfDecimalPlaces;
}
我调用数字函数来对它们进行数学运算(最小公乘)。我需要整数来执行此操作,以便搜索小数位数最多的数字。然后我将每个数字乘以 10 ^(大多数小数位)。处理的数字是用户输入的,属于线性方程组。在大多数情况下,两位小数就足够了。
数字本身不必非常精确,但它们的小数位必须与用户输入的内容相匹配。
【问题讨论】:
-
“Floating point imprecision”并不是你想的那样,而且这个问题中没有足够的信息来说明结果是否会是你想要的。
-
当我用
1.4调用函数时,我希望得到1返回。我不想让我的程序将号码处理为1.3999999999999...。 -
是的,我不确定'消除浮点不精确'实际上是否可行,在一般情况下,不牺牲准确性:(
-
你是对的,但到目前为止,
sprintf()或printf()可以告诉我返回我想要看到的值而不是内部表示。所以我想知道我是否可以相信它来确定数字的小数位。 -
显示浮点数与实际显示的浮点数不同。