我有一个奇怪的问题。这是我的代码的一部分:
int temp=1100;
int foo=floor(0.03*temp);
int foo1=0.03*temp;
if(foo-foo1){
cout<<foo<<endl;
cout<<foo1<<endl;
}
如果temp
的3%=整数,则foo
与foo1
的差异为1.
例如:
1100 * 0.03 = 33。
foo
= 33
foo1
= 32
另外,如果我这样写:
int foo=floor(0.03*1100);
int foo1=0.03*1100;
没有这样的问题。
为什么呢?
答案 0 :(得分:2)
浮点数在渲染小数位时遇到问题。它更像是近似值。
2 ** - 6 + 2 ** - 7 + 2 ** - 8 + 2 ** - 9 + 2 ** - 11 + 2 ** - 13 + 2 ** - 14 + 2 ** - 15 + 2 ** - 20 + 2 ** - 22 + 2 ** - 26 = 0.0299999863
使用二进制,我将精度提高到26二进制。我接近0.03但不完全。在我的例子中,我选择低于0.03,但我可能已经超过了一点(即0.03000001。我不认为可以用浮点表示法完美地表示0.03。
将任何数字乘以0.03会产生另一个近似值。转换为int类型会删除小数点后的所有内容。我假设楼层的实施更优雅。您的编译器可能选择浮点值为32.99999,因此int将为32。