c++ - Floor vs int 转换差异

标签 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;

不存在这样的问题。
为什么?

最佳答案

float 在呈现小数位方面存在问题。它更像是一个近似值。

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 类型将删除小数点后的所有内容。我假设 floor 的实现更优雅。您的编译器可能会选择一个浮点值 32.99999,因此 int 会变成 32。

关于c++ - Floor vs int 转换差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41323147/

相关文章:

c++ - 定义全局数组的运行时间成本?

swift - 将 CLLocationCoordinate2D 转换为 double 或 int swift

java - 如何将用户输入添加到我的 Java 程序中以便在 if 语句中使用

c++ - 在没有反射/内省(introspection)的情况下确定 C++ 中的类类型

c++ - 乘以 1.0 和 int 到浮点转换的精度

c++ - 将数组作为指针参数传递

Pythonic 整数乘法和加法

excel - 如何使用excel函数: If, Mod和Floor

JavaScript Math.floor : how guarantee number will round down?

javascript - 为 cookie key 取一个随机指数值