使用float时printf格式化输出不符预期?格式规则理解误区咨询
关于printf格式化float的两个疑问解答
嘿,这俩问题本质都是对printf格式符规则的误解,我给你拆解明白~
疑问二:对%2.3f的理解哪里错了?
你完全搞反了格式符里宽度和精度的作用,而且对“宽度”的定义理解错了:
%2.3f里的2是最小输出宽度,不是强制固定的总宽度。它的意思是:如果最终输出的字符总数(包括数字、小数点)小于2,就用空格填充到2位;但如果实际需要的字符数超过2,就会完整输出所有内容,绝对不会截断数字。- 而
.3是精度,针对浮点数来说,它指定的是小数点后要保留的位数,不足的会补0。
你的例子里,9.010一共是5个字符(9、.、0、1、0),远大于设置的最小宽度2,所以printf直接输出了完整的5个字符,根本不会出现你担心的“截断9只输出01”的情况。
疑问一:为何用float类型时会输出当前的格式化结果?
这个其实结合上面的规则就好理解了:
- 首先,
float j=9.01;,虽然9.01在二进制浮点数中无法精确存储,但当用%.3f格式化时,printf会把它四舍五入到小数点后3位,刚好得到9.010。 - 其次,float类型在printf中会被自动提升为double类型处理,但这不会影响格式化结果,核心还是遵循
%2.3f的规则:精度要求保留3位小数(补0凑够位数),而最小宽度2因为实际输出长度超标,所以完全不起作用,最终就输出了9.010。
内容的提问来源于stack exchange,提问作者Agrudge Amicus
相关产品推荐
相关产品推荐

