You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:05:03