2010-06-27 120 views
15

也许,这是一个非常简单的问题,但我无法得到答案。我一直在寻找相当长一段时间(现在的谷歌认为我发送自动查询http://twitter.com/michaelsync/status/17177278608)..C++ float to int

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

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

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

谢谢。

+3

如果4.35在乘法之前被转换为“int”,结果如何为434?那不是400吗?只是为了排除你的一个解释。 – pmr 2010-06-27 16:27:45

+0

如果你做了int y =(int)(4.35 * 100);你不会 - 如果你打算调用一个函数,你可以选择一个合适的函数来得到你需要的答案,也可以在C++中完成。但是在示例代码中,您并未调用函数,而是使用由该语言提供的隐式类型转换。 – 2010-06-27 16:39:23

+2

4.35不完全可以表示。下一个最接近的double值似乎是(在你的情况下)4.34999 ...,乘以100,结果是434.999 ...,因此转换为434. – sellibitze 2010-06-27 17:39:49

回答

36

What Every Computer Scientist Should Know About Floating-Point Arithmetic

这真的只是一个起点,可悲的是,正如当时的语言介绍自己的弱点,当他们做类型转换,等等。在你仅仅创造了这个情况的情况下不断的4.35所能没有精确表示,因此4.35 * 100更像434.9999999999,并且int转换为trunc,而不是round

+0

它只是在C++中吗?它不会发生在C#中。int n = Convert.ToInt32(4.35 * 100); Console.WriteLine(n); – 2010-06-27 16:34:51

+0

它确实发生在C#中,如果你投了,但你没有投射 - ToInt32轮(因为它非常清楚地在文档中说明)。你也可以用C++进行四舍五入(好吧,'floor'或者'ceil',但是加/减0.5来做一个舍入函数) – 2010-06-27 16:36:41

+0

好吧..明白了..谢谢.. – 2010-06-27 16:41:39

2

4.35的内部结果最终为4.349999999或类似结果。乘以100位十进制数,当转换为int时,.9999将被删除(截断)。

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

7

如果你运行这个语句:

cout << 4.35 

美元,甜甜圈,你得到的东西几乎相当于4.3499998821因为4.35是不是在一个浮动精确表示。

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

为了让您的期望的行为,请尝试:

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

(与floor的trickyness是因为C++不具有天然round()功能)

0

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

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;