可能重复:
C++中float的round()
我有一个双(称为x),意味着55,但实际存储为54.999999999999943157,我刚才意识到.
所以,当我这样做
double x = 54.999999999999943157;
int y = (int) x;
Run Code Online (Sandbox Code Playgroud)
y = 54而不是55!
这困惑了我很久了.如何让它正确圆?
我正在使用C(不是C++).
我需要将一个浮点数转换成一个int.我不想舍入到最接近的数字,我只是想消除整数部分之后的内容.就像是
4.9 -> 4.9-> 4
我目前正在使用需要运行32位系统的旧代码.在这项工作中,我偶然发现了一个问题(出于学术兴趣),我想了解其原因.
如果对变量或表达式进行强制转换,似乎在32位C中从float转换为int的行为会有所不同.考虑该计划:
#include <stdio.h>
int main() {
int i,c1,c2;
float f1,f10;
for (i=0; i< 21; i++) {
f1 = 3+i*0.1;
f10 = f1*10.0;
c1 = (int)f10;
c2 = (int)(f1*10.0);
printf("%d, %d, %d, %11.9f, %11.9f\n",c1,c2,c1-c2,f10,f1*10.0);
}
}
Run Code Online (Sandbox Code Playgroud)
使用-m32修饰符直接在32位系统或64位系统上编译(使用gcc),程序的输出为:
30, 30, 0, 30.000000000 30.000000000
31, 30, 1, 31.000000000 30.999999046
32, 32, 0, 32.000000000 32.000000477
33, 32, 1, 33.000000000 32.999999523
34, 34, 0, 34.000000000 34.000000954
35, 35, 0, 35.000000000 35.000000000
36, 35, 1, 36.000000000 35.999999046
37, 37, 0, 37.000000000 37.000000477
38, …Run Code Online (Sandbox Code Playgroud)