为何double类型与%f格式符无法正确输出10位小数?
浮点数精度与输出偏差的原因
这不是%f格式符的问题,根源在于double类型的二进制存储特性:
- double是64位IEEE 754浮点数,它没法精确表示所有十进制小数。你写的
15.1234567899876这个十进制数,转换成二进制double后,实际存储的是一个近似值,和你输入的十进制数并非完全相等。 - 当用
%13.10f输出时,printf会对这个近似值做十进制转换,并按四舍五入规则保留10位小数。
具体细节:
- 你赋值的
15.1234567899876,实际存储为double后,真实值更接近15.1234567899876002,比你预期的15.1234567899要大一点。 - 保留10位小数时,第11位数字是8(原数的第11位是8:15.1234567899876),触发四舍五入规则:第10位的9加1变成10,进而向第9位进位,最终就得到了
15.1234567900。
你可以用更精确的输出验证这个问题,比如把格式符改成%.20f:
#include <stdio.h> int main(void) { double a = 15.1234567899876; printf("%.20f", a); }
运行后会看到类似15.12345678998760021357的输出,这就能直观看到存储的实际值确实比你输入的十进制数略大。
另外说明:%f格式符完全适配double类型(float传入printf时会自动提升为double),所以格式符的使用是正确的,问题核心就是浮点数的精度限制。
内容的提问来源于stack exchange,提问作者jeaq
相关产品推荐
相关产品推荐

