Visual c++ floor()行为异常VC++;
我正在做一些编码,突然对floor()的奇怪行为感到惊讶。导致错误的一条线如下所述:Visual c++ floor()行为异常VC++;,visual-c++,Visual C++,我正在做一些编码,突然对floor()的奇怪行为感到惊讶。导致错误的一条线如下所述: printf("%f",floor(310.96*100)); 输出为31095.0000 为什么会发生这种情况?浮点数不是100%精确的310.96*100可能导致31095.9999999。。。因此您的结果,请参见浮点数不是100%精确的310.96*100可能会导致31095.9999999。。。因此,请参见您的结果,这是典型的。常量值310.96不能以浮点数表示。相反,最接近的浮点值表示形式是310.
printf("%f",floor(310.96*100));
输出为31095.0000
为什么会发生这种情况?浮点数不是100%精确的310.96*100可能导致31095.9999999。。。因此您的结果,请参见浮点数不是100%精确的310.96*100可能会导致31095.9999999。。。因此,请参见您的结果,这是典型的。常量值
310.96
不能以浮点数表示。相反,最接近的浮点值表示形式是310.9599914550781
你可以试试你自己。将其乘以100
并用floor()
截断,得到31095.0000
这是一个典型的例子。常量值310.96
不能以浮点数表示。相反,最接近的浮点值表示形式是310.9599914550781
你可以试试你自己。将该值乘以
100
,并用floor()截断(
结果为31095.0000
,但为什么在310.95或310.97中不发生相同的情况??温度=310.96*100;地板(温度);输出是31096……为什么不在这里发生?如果你在我链接的站点上查看,你可以看到310.95
最接近的浮点表示是310.95001220703125
,它大于310.95
,因此乘法结果的floor()
(在本例中)将导致预期值。一般的经验法则是,不依赖精确的摆动点值,而是了解其局限性并对此进行补偿,使用范围或适当的舍入机制,但为什么在310.95或310.97??温度=310.96*100时不发生同样的情况;地板(温度);输出是31096……为什么不在这里发生?如果你在我链接的站点上查看,你可以看到310.95
最接近的浮点表示是310.95001220703125
,它大于310.95
,因此乘法结果的floor()
(在本例中)将导致预期值。一般的经验法则是,不依赖精确的摆动点值,而是了解其局限性,并通过使用范围或适当的舍入机制进行补偿