我试图通过仅使用句点后的2个最重要的值来管理浮点错误:
static float lowerPrecision(float highPrecisionFloat)
{
char buff[8] = {0};
sprintf(buff, "%.2f", highPrecisionFloat);
float lowerPrecisionFloat = atof(buff);
return lowerPrecisionFloat;
}
void main(void)
{
float highPrecisionFloat = 127 / 100.0;
printf("highPrecisionFloat: %.12f\n", highPrecisionFloat);
float lowerPrecisionFloat = lowerPrecision(highPrecisionFloat);
printf("lowerPrecisionFloat: %.12f\n", lowerPrecisionFloat);
}
返回:
highPrecisionFloat: 1.269999980927
lowerPrecisionFloat: 1.269999980927
为什么我的实现不起作用(我认为这是atof的错)并且可以修复它吗?
答案 0 :(得分:1)
1.269999980927
是最接近浮点数127/100的十进制表示的第一个数字。你不能把它四舍五入到接近127/100的东西。
您可以将多个float
值舍入到一组选定的代表中。在某些情况下,这是处理浮点近似的有效策略,这就是你的函数lowerPrecision
所做的事情(虽然效率低,并且存在堆栈溢出的有趣风险)。但是该函数不能返回代表127/100的float
,因为该浮点数不存在。
二进制浮点类型使用二进制表示,其中1/10和127/10不能用任意数量的小数位数精确表示。您可以选择使用最多8个二进制数字(而不是两个十进制数字)的代表,或者您可以将函数lowerPrecision
保持为书面状态,但不管怎样,您可以编写的函数都不会返回浮点数完全代表127/100。
通过将hexadecimal format %a
用于浮点值的输入和输出,可以使浮点类型的二进制表示更加内向。这将有助于make it intuitive无法准确表示某些简单的十进制值。