地板与int铸造差异

时间:2016-12-25 17:27:46

标签: c++ int floor

我有一个奇怪的问题。这是我的代码的一部分:

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%=整数,则foofoo1的差异为1.
例如:
1100 * 0.03 = 33。
foo = 33
foo1 = 32 另外,如果我这样写:

int foo=floor(0.03*1100);
int foo1=0.03*1100;

没有这样的问题。
为什么呢?

1 个答案:

答案 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。