c++ - 从 float 到 int 的奇怪转换

标签 c++

for(float i = 40; i <= 42; i+=0.1f)
{
    float offset = (i-40) * 10 * sizeof(float);
    int wtf = offset;
    printf("%.1f =?= %d\n", offset, wtf);
    fseek(fin, offset, SEEK_SET);
    fread(&tf, sizeof(float), 1, fin);
    //printf("%.1f %.4f\n", i, tf);
}

输出:

0.0 =?= 0 4.0 =?= 3 8.0 =?= 7 12.0 =?= 11 16.0 =?= 15 20.0 =?= 19 24.0 =?= 23 28.0 =?= 27 32.0 =?= 31 36.0 =?= 35 40.0 =?= 39 44.0 =?= 43 48.0 =?= 47 52.0 =?= 51 56.0 =?= 55 60.0 =?= 59 64.0 =?= 63 68.0 =?= 67 72.0 =?= 71 76.0 =?= 75 80.0 =?= 79

我不明白这个,你能帮我吗?

最佳答案

问题是 0.1 不能完全表示为二进制 float 。每个 float 值都略小于您的预期,并且转换为 int 会向下舍入,给出的值比您预期的小 1。

您可以通过四舍五入到最接近的整数来获得期望值:

int wtf = std::round(offset);

关于c++ - 从 float 到 int 的奇怪转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20200309/

相关文章:

c++ - C++ 堆栈的简单 PUSH 函数

C++ static_cast<void *>

c++ - 检测Enter键以获取用于int类型的输入

c++ - 在结构 vector 中,我应该在结构中使用 char[] 而不是 std::string 以便它们是 POD 吗?

c# - 将字符串的引用从 C# 传递到 C++ 函数

c++ - 将内联 GASM 移植到 x64 MASM 访问冲突问题

c++ - 如何在 C++ 中跳过读取 csv 文件的第一列

c++ - 继承的类数据成员

c++ - __VA_ARGS__ 有问题

c++ - 如何调整 RealSense::Image 的大小