我需要将具有系统精度的浮点数转换为具有指定精度(例如 3 个小数位)的浮点数以用于打印输出。fprintf 函数不足以解决此问题,因为它无法正确舍入某些数字。我尝试过的所有其他解决方案都失败了,因为当我转换回浮点数时,它们都重新引入了不希望的精度。例如:
float xf_round1_f(float input, int prec) {
printf("%f\t",input);
int trunc = round(input * pow(10, prec));
printf("%f\t",(float)trunc);
input=(float)trunc / pow(10, prec);
printf("%f\n",input);
return (input);
}
此函数将输入、截断的整数和输出打印到每一行,对于一些应该截断到小数点后 3 位的数字,结果如下所示:
49.975002 49975.000000 49.974998
49.980000 49980.000000 49.980000
49.985001 49985.000000 49.985001
49.990002 49990.000000 49.990002
49.995003 49995.000000 49.994999
50.000000 50000.000000 50.000000
您可以看到第二步按预期工作 - 即使将“trunc”强制转换为浮点数以进行打印 - 但一旦我将其转换回浮点数,精度就会返回。第 1 行和第 6 行说明了问题案例。
当然必须有一种方法来解决这个问题——即使第一行结果仍然是 49.975002,格式化的打印也会产生预期的效果,但在这种情况下存在一个真正的问题。
有什么解决办法吗?