我正在試圖創建一個使我能夠打印浮點數的函數。 現在,我遇到了兩種奇怪的行爲: 有時,像1.3這樣的值出現爲1.2999999而不是1.3000000,有時像1.234567這樣的值出現爲1.2345672而不是1.2345670。C - 打印一個浮點數 - 當將其轉換爲int時丟失精度
這裏的源代碼:
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是OK AFAIK。對於「write(1,&c,1)」,ft_putchar是一個簡單的調用。
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位小數。如果你想要更多,請嘗試'雙'。 – 2014-11-04 22:43:28
歡迎來到浮點數學。您注意到的任何「症狀」都不是意外的或異常的。 – 2014-11-04 22:45:09
哼...有沒有辦法解決這些「症狀」? – SwiX 2014-11-04 22:48:35