C语言中double类型打印一位小数为何会向上舍入?
为什么19.99的double变量打印时会出现不同舍入结果?
核心原因是double类型无法精确存储十进制的19.99,二进制浮点数的精度限制导致变量实际存储的是一个接近19.99的近似值,不同的打印格式触发了不同的舍入逻辑:
- 二进制浮点数的本质:double是64位浮点数,只能精确表示分母为2的幂的分数(比如0.5=1/2,0.25=1/4)。而19.99对应的分数是1999/100,分母100包含因子5,无法转化为2的幂次形式,因此编译器会将19.99转换为最接近它的double近似值。
- 实际存储的近似值:这个近似值其实是略大于19.99的(比如约19.990000000000002)。
- 一位小数的舍入:当用
printf("%.1lf", myDoubleNum)打印时,需要将值四舍五入到一位小数。此时看第二位小数是9,根据四舍五入规则,第一位小数9加1后进位,整数位19也随之加1,最终得到20。 - 两位小数的舍入:当用
printf("%.2lf", myDoubleNum)打印时,四舍五入到两位小数。此时第三位小数是0(近似值的前两位小数就是99,后续是极小的正数),所以不需要进位,结果就是19.99。
你可以用更高精度的格式验证这个近似值:
printf("%.20lf\n", myDoubleNum);
运行后会输出类似19.99000000000000213163的结果,直观看到实际存储的数值。
内容的提问来源于stack exchange,提问作者Jorge
相关产品推荐
相关产品推荐

