C ++浮点到int

时间:2010-06-27 16:24:47

标签: c++

也许,这是一个非常简单的问题,但我无法得到答案。我已经搜索了很长一段时间(现在Google认为我正在发送自动查询http://twitter.com/michaelsync/status/17177278608)..

int n = 4.35 *100;
cout << n;

为什么输出变为“434”而不是“435”? 4.35 * 100 = 435这是一个整数值,这应该可以分配给整数变量“n”,对吗?

OR C ++编译器在乘法之前是否将4.35转换为整数?我认为不会。为什么编译器会自动将4.35更改为4.34,这仍然是一个浮点数?

感谢。

5 个答案:

答案 0 :(得分:38)

What Every Computer Scientist Should Know About Floating-Point Arithmetic

这真的只是一个起点,遗憾的是,因为当时语言会介绍他们自己何时进行类型转换,等等。在这种情况下,你只是创造了一个无法精确表示常量4.35的情况,因此4.35 * 100更像是434.9999999999,而int的强制转换为trunc,而不是round

答案 1 :(得分:7)

如果您运行此声明:

cout << 4.35

美元到甜甜圈你会得到类似于4.3499998821的东西,因为4.35在浮动中不能完全代表。

当编译器将float转换为int时,它会截断。

要获得您期望的行为,请尝试:

int n = floor((4.35 * 100.0) + 0.5);

floor的棘手问题是因为C ++没有本地round()函数)

答案 2 :(得分:2)

4.35的内部表示最终为4.349999999或类似。乘以100移位小数,转换为int时,.9999将被删除(截断)。

编辑:正在寻找尼克发布的链接。 :)

答案 3 :(得分:0)

浮点数don't work that way。许多(大多数,技术上无限数量......)值不能作为浮点精确存储或操作。 4.35似乎就是其中之一。它被存储为实际低于4.35的东西,因此是你的结果。

答案 4 :(得分:0)

float转换为int时,小数部分会被截断,转换的值不会接近intfloat的值。

4.35无法准确表示为float,最接近的可表示数字(我们可以推断)略小于4.35,即4.34999 ...,所以乘以100得到434.999 ..

如果您想将正面float转换为最近的int,则应在转换为int之前添加0.5。

E.g。

int n = (4.35 * 100) + 0.5;
cout << n;