【发布时间】:2014-11-04 22:39:37
【问题描述】:
我正在尝试制作一个可以打印浮点数的函数。 现在,我遇到了两种奇怪的行为: 有时,像 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 没问题,AFAIK。 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只能准确表示大约 7 位小数。如果您想要更多,请尝试double。 -
欢迎来到浮点数学。您注意到的任何“症状”都不是意外或异常的。
-
哼...有没有办法解决这些“症状”?
-
@SwiX 是的。使用定点数而不是浮点数。
-
好的,谢谢。我并没有像我希望的那样深入了解其背后的机制,但必须这样做 - 该功能仍然足够准确,可以达到它的目的;)