我不明白为什么在逗号四舍五入后尝试将double转换为int值。
void print_float(double nb)
{
int negative;
int intpart;
double decpart = -10.754;
int v;
negative = (nb < 0.0f);
intpart = (int)nb;
decpart = nb - intpart;
v = (int)(decpart * 1000);
if (negative) {
v *= -1;
}
printf("%i.%i", intpart, v); // output: -10.753
}
我以为后顾之忧来自猜测,但我不明白问题所在。
答案 0 :(得分:6)
double
无法完全编码所有数字。它可以精确编码大约2 64 个不同的值。 -10.754
不是其中之一。取而代之的是,附近使用的值比预期的少。
printf("%.24f", -10.754);
// -10.753999999999999559463504
decpart * 1000
部分引入了一些不精确性,但乘积仍低于754.0,然后(int)
强制转换为753。