也许,这是一个非常简单的问题,但我无法得到答案。我已经搜索了很长一段时间(现在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,这仍然是一个浮点数?
感谢。
答案 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
时,小数部分会被截断,转换的值不会接近int
到float
的值。
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;