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/