我使用sprintf - sscanf组合来四舍五入浮点小数,我是这样做的
float rounding(float number)
{
char* rounded_number;
float rounded;
sprintf(rounded_number, "%.2e", rounded_number);
sscanf(rounded_number, "%e", &rounded);
return rounded;
}
在循环外调用一次,在循环内调用一次。在任何循环之外尝试都会得到预期的结果,但是调用
for (int j = 1; j < 101; j++)
printf("%f", rounding( 1.0 / ((float) j)));
给出一个分段错误。
谁能解释一下?谢谢。
您的sprintf
调用有未定义的行为,因为目标指针未初始化,到sprintf
试图写入内存中的一些随机位置,很可能导致分段错误。
此外,您传递rounded_number
而不是number
作为%.2e
的参数,这是另一种未定义的行为。
您应该使用snprintf
并传递一个本地数组:
float rounding(float number) {
char buf[32];
snprintf(buf, sizeof buf, "%.2e", number);
sscanf(buf, "%e", &number);
return number;
}
但是请注意,在许多情况下,四舍五入的数字并不表示带有2位小数的精确值。浮点类型使用的二进制编码不能准确地表示大多数小数:只有1
、0.5
和0.25
的整数倍才能准确地表示。