编译器将float变量转换为整数变量时会做什么?

时间:2011-10-14 16:50:02

标签: c++ types casting floating-point int

编译器做什么?目的是将点后面的数字作为整数。我是这样做的:

float a = 0;
cin >> a;

int b = (a - (int)a)*10;

现在我的问题是:当我输入例如3.2时,我得到2,这就是我想要的。它也适用于.4,.5和.7。但是当我输入例如2.3时,我得到2.对于2.7我得到6,依此类推。但是当我没有变量时,例如:

(2.3 - (int)2.3)*10;

我得到了正确的结果。

我无法弄清楚编译器的作用。我总是想到当我将一个浮点数转换成一个整数时,它只是简单地切入该点。这是编译器在使用常数时实际执行的操作。但是,当我使用变量时,编译器会减少其中的一部分,但不是全部。

4 个答案:

答案 0 :(得分:3)

您很可能没有编译器的问题,但事实上浮点数无法在二进制计算机上准确表示。

所以,当你这样做时:

float f = 2.7f;

..实际存储在计算机中的是:

2.6999999999999999

这是二进制计算机上浮点的一个众所周知的特征。 SO上有很多帖子都在讨论这个问题。

答案 1 :(得分:2)

基本上,问题来自二进制文件具有与基数10不同的“无限重复”值的事实。例如。十进制中的1/10是0.1,二进制,它是0.000110011001100110011001100 ...问题是由于浮点数无法正确保持2.3,因为它是无穷多的二进制数字,但它近似很近,可能是2.2999999。对于大多数数学来说,它足够接近。但要小心截断。

一种解决方案是在截断之前进行舍入。

int b = (a - (int)(a+.05))*10;

另请注意,浮点值在内存中的大小与寄存器中的大小不同,这意味着在比较时,如果两个浮点值相等,则必须进行舍入。

答案 2 :(得分:1)

出现差异的原因在于,默认情况下,浮点文字是双精度数,具有更高的准确性,并且更能够代表您正在寻找的值。

答案 3 :(得分:0)

你为什么不这样做?

b = (a*10)%10;

我觉得它容易多了。