打印浮点变量和常量有什么区别?

13

这是我的代码:

float x = 21.195;
printf("%.2f\n", x);
printf("%.2f\n", 21.195);

我本来以为两个打印语句会输出相同的结果,但实际上第一个输出21.19,第二个输出21.20

有人能解释一下为什么会出现这种差异吗?


注意:根据 FLT_EVAL_METHOD 和其他因素,输出可能相同。 - chux - Reinstate Monica
3个回答

16
数值不同。第一个是float,通常为4个字节。第二个是double,通常为8个字节。
舍入规则基于小数点后第三位数字。因此,在某种情况下,该值类似于21.19499997,另一个类似于21.1950000000001,或者类似于这样。(这些都是虚构的例子,用来说明舍入和不精确数字格式的问题。)

抱歉Gordon,在我输入时没有看到你的回答。 - Emmanuel DURIN
1
浮点数通过否定证明了(在此插入您最喜欢的神灵名称),因为它们显然是(在此插入您最喜欢的邪恶化身的名称)的杰作。 :-) - Bob Jarvis - Слава Україні
感谢您的帮助~(^_^) - Tamara

7

默认情况下,21.195是一个双精度数。

如果你想要一个单精度数,请写:

21.195F

或者

(float)21.195

祝好!


感谢您的帮助~#^_^# - Tamara

0

在C语言中定义浮点变量时,默认情况下它被设置为双精度(double)。所以如果你没有显式地指定,21.195会被认为是double类型,而x被显式地设置为float类型。

如上所述,float通常占用4个字节,而double占用8个字节。因此,一个float值有24个有效位数,能够精确表示7位数字;而double拥有53个有效位数,能够精确表示15到16位数字

一个四舍五入函数 %.2f 用于将数字四舍五入到小数点后两位,并检查小数点后第三位来进行取整。因此,在float中,21.195扩展为21.19499998,然后通过%.2f减少到21.19;而在double中,21.195扩展为21.1950000000000001,因此减少到了21.20。

希望这可以帮助到你!


没有所谓的“默认” - 声明浮点变量为 float,声明双精度变量为 double。您似乎在谈论 21.195,这是一个字面值,而不是一个变量。关于字面值的规则是,如果它包含 . 且没有后缀,则为 double;如果它有一个 f 后缀,则为 float - M.M
@M.M:是的,我意思也是这个。当21.195被声明为x时,它是一个变量,而21.195本身是一个字面量。在回答中错过了这一点。感谢您指出。 - Bellatechie30

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接