2011-10-14 33 views
2

编译器有什么作用?目标是将点之后的数字作为整数。我这样做:编译器在将float变量转换为整型变量时会做什么?

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; 

我得到正确的结果。

我找不出什么编译器。当我将一个浮点数转换为一个整数时,我一直认为它只是简单地切入点。这是编译器在使用常数时实际执行的操作。但是,当我使用变量时,编译器会减少其中的一些,但并非全部。

+3

你的编译器是“他”?滑稽。我的一个“她”... –

+0

@John我的编译器是一台性机器 – MGZero

+0

你会发现浮点数是不精确的,并且打印它们将围绕最小数字,而(int)不舍入。 –

回答

3

您很可能不会遇到编译器问题,但事实上浮点数不能完全在二进制计算机上表示。

所以,当你这样做:

float f = 2.7f; 

..what实际上可能存储在计算机是:

2.6999999999999999 

这是浮动点的二进制计算机一个非常著名的特征。 SO上有很多帖子讨论这个问题。

2

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

一种解决方法是在截断之前舍入。

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

还要注意的是浮点值在存储器中具有不同的尺寸比在寄存器,这意味着比较时,如果两个浮点值是等于,以及你必须圆。

1

造成这种差异的原因是,默认情况下,浮点文字是双精度,精度更高,并且能够更紧密地表示要查找的值。

+0

他们似乎都是<= 2.3甚至80位版本似乎是相同的:-) http://pages.cs.wisc.edu/~rkennedy/exact-float?number=2.3 – xanatos

+0

@xanatos你'再右吧。我想这是基于浮点值四舍五入的方式。我将从我的答案中删除第二段。 –

0

你为什么不这样做呢?

b = (a*10)%10; 

我发现它更容易。

相关问题