以前真没注意过,今天同事提出来测试了一下才发现。
不在对象内的浮点变量强制转换的时候是正常的,如
float a=0.02;
int b=(int)(a*100);
结果 b=2
但是如果float a 是C++类中的属性变量的时候如
class c
{
float a;
}
这样的话 int b=(int)(new c()->a*100);
结果 B=1;
经检查应该是强制转换的时候四舍五入没取大值的原因,加上ceil()函数就可以了(int)(ceil(new c()->a*100))
-----------------------------------------------------------------------------------------------------------------------
根据反编译发现最后都是通过ftol2_sse或者ftol2内置函数来进行浮点到整形的变化。判断如果CPU支持浮点运算就调用ftol2_sse方法,如果不支持用ftol2方法。
如果0.01f*100的话应该是等于1.99..的数值,ftol2取整的话直接取>0的整数部分没有四舍五入。
本文深入探讨了在不同情况下,C++中浮点数转换为整型时的四舍五入行为及底层实现原理,通过实例分析,揭示了在类属性中进行此类转换时可能出现的精度损失,并提出了解决方案。
2914

被折叠的 条评论
为什么被折叠?



