c – 地板与整体铸造差异

参见英文答案 >
Is floating point math broken?                                    28个

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

int temp=1100;
int foo=floor(0.03*temp);
int foo1=0.03*temp;
if(foo-foo1){
        cout<<foo<<endl;
        cout<<foo1<<endl;
}

如果3%的temp =整数,那么foo与foo1的差异为1.
例如:1100 * 0.03 = 33. foo = 33 foo1 = 32.
另外,如果我这样写:

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

没有这样的问题.

为什么?

最佳答案 浮点数在渲染小数位时遇到问题.它更像是近似值.

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.

点赞