为什么C语言printf函数打印浮点数时取整表现存在差异?
printf打印浮点值表现不一致的原因
这个现象和printf的取整逻辑无关,本质是双精度浮点数的二进制存储精度限制导致的:
- IEEE 754标准的双精度浮点数(也就是C语言中的
double类型)用64位二进制存储数值,只有能表示为整数/2^n形式的十进制小数才能被完全精确存储,其余十进制小数只能存储距离它最近的二进制可表示值作为近似。 - 你测试的三个十进制数值对应的双精度近似值存在差异:
- 10.10、10.15对应的双精度近似值和十进制原值的误差非常小,当用
%.15lf格式保留15位小数打印时,四舍五入后刚好匹配原值的直观表现 - 10.12对应的双精度近似值本身略小于十进制的10.12,误差在15位小数的量级上刚好可以被观测到,因此打印出来就会显示为10.119999999999999,并不是printf主动做了向下取整操作
- 10.10、10.15对应的双精度近似值和十进制原值的误差非常小,当用
你使用的测试代码:
#include<stdio.h> int main() { printf("10.10 = %.15lf\n", 10.10); printf("10.12 = %.15lf\n", 10.12); printf("10.15 = %.15lf\n", 10.15); return 0; }
运行输出:
10.10 = 10.100000000000000 10.12 = 10.119999999999999 10.15 = 10.150000000000000
如果将打印精度调整为%.17lf,就能看到三个数值的存储误差全部显现,不存在10.10、10.15完全精确的情况。
内容的提问来源于stack exchange,提问作者Tushar Rathi
相关产品推荐
相关产品推荐

