我正在尝试创建一个可以打印 float 的函数。 现在,我遇到两种奇怪的行为: 有时,像 1.3 这样的值会显示为 1.2999999 而不是 1.3000000,有时像 1.234567 这样的值会显示为 1.2345672 而不是 1.2345670。
这是源代码:
int ft_putflt(float f)
{
int ret;
int intpart;
int i;
ret = 0;
i = 0;
intpart = (int)f;
ft_putnbr(intpart);
ret = ft_nbrlen(intpart) + 8;
write(1, ".", 1);
while (i++ < 7)
{
f *= 10;
ft_putchar(48 + ((int)f % 10));
}
return (ret);
}
据我所知,ft_putnbr 没问题。 ft_putchar 是对“write(1, &c, 1)”的简单调用。
test values (value : output)
1.234567 : 1.2345672 (!)
1.2345670 : 1.2345672 (!)
1.0000001 : 1.0000001 OK
0.1234567 : 0.1234567 OK
0.67 : 0.6700000 OK
1.3 : 1.3000000 OK (fixed it)
1.321012 : 1.3210119 (!)
1.3210121 : 1.3210122 (!)
这一切对我来说似乎有点神秘......转换为 int 时可能会损失精度?
最佳答案
是的,当弄乱 float 和整数时,你会失去精度。
如果两个 float 的大小不同,并且都使用完整的精度范围(大约 7 个十进制数字),那么是的,您会在最后几位看到一些损失,因为 float 以(符号)(尾数)的形式存储) × 2(指数)。如果两个值具有不同的指数并且您将它们相加,则较小的值将减少到尾数中更少的数字(因为它必须适应较大的指数):
PS> [float]([float]0.0000001 + [float]1)
1
相对于整数,普通的 32 位整数能够精确地表示不能完全适合 float 的值。 float 仍然可以存储大约相同的数字,但不再精确。当然,这只适用于足够大的数字,即。 e.长于 24 位。因为浮点有 24 位精度,而(32 位)整数有 32 位,所以浮点仍然能够保留大小和大部分有效数字,但最后的位置可能会有所不同:
PS> [float]2100000050 + [float]100
2100000100
关于c++ - C - 打印 float - 转换为 int 时精度损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26746416/