简体   繁体   English

C ++浮点到int

[英]C++ float to int

Maybe, it's very simple question but I couldn't get the answer.也许,这是一个非常简单的问题,但我无法得到答案。 I've been searching quite a while ( now Google think that I'm sending automated queries http://twitter.com/michaelsync/status/17177278608 ) ..我已经搜索了很长时间(现在谷歌认为我正在发送自动查询http://twitter.com/michaelsync/status/17177278608 )..

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

Why does the output become "434" instead of "435"?为什么输出变成“434”而不是“435”? 4.35 * 100 = 435 which is a integer value and this should be assignable to the integer variable "n", right? 4.35 * 100 = 435 这是一个整数值,应该可以分配给整数变量“n”,对吧?

OR Does the C++ compiler cast 4.35 to integer before multiplying?或者 C++ 编译器在乘法之前是否将 4.35 转换为整数? I think it won't.我认为不会。 Why does the compiler automatically change 4.35 to 4.34 which is still a float??为什么编译器会自动将 4.35 更改为仍然是浮点数的 4.34?

Thanks.谢谢。

What Every Computer Scientist Should Know About Floating-Point Arithmetic 每个计算机科学家都应该知道的关于浮点运算的知识

That's really just a starting point, sadly, as then languages introduce their own foibles as to when they do type conversions, etc. In this case you've merely created a situation where the constant 4.35 can't be represented precisely, and thus 4.35*100 is more like 434.9999999999, and the cast to int does trunc , not round .遗憾的是,这实际上只是一个起点,因为那时语言会在何时进行类型转换等方面引入自己的弱点。在这种情况下,您只是创建了一个无法精确表示常量 4.35 的情况,因此 4.35 *100 更像 434.9999999999,并且转换为int确实trunc ,而不是round

If you run this statement:如果您运行此语句:

cout << 4.35

Dollars to donuts you get something approximately like 4.3499998821 because 4.35 isn't exactly representable in a float.美元到甜甜圈你得到大约像 4.3499998821 的东西,因为 4.35 在浮点数中不能完全表示。

When the compiler casts a float to an int it truncates.当编译器将 float 转换为 int 时,它会截断。

To get the behavior your expect, try:要获得您期望的行为,请尝试:

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

(The trickyness with floor is because C++ doesn't have a native round() function) floor的棘手之处在于 C++ 没有原生的round()函数)

The internal representation of 4.35 ends up being 4.349999999 or similar. 4.35 的内部表示最终是 4.349999999 或类似的。 Multiplying by 100 shifts the decimal, and the .9999 is dropped off (truncated) when converting to int.乘以 100 会移动小数点,并且 .9999 在转换为 int 时会被丢弃(截断)。

Edit: Was looking for the link Nick posted.编辑:正在寻找尼克发布的链接。 :) :)

Floating point numbers don't work that way .浮点数不能那样工作 Many (most, technically an infinite number of...) values cannot be stored or manipulated precisely as floating point.许多(大多数,从技术上讲是无限数量的......)值不能作为浮点数精确存储或操作。 4.35 would seem to be one of them. 4.35 似乎就是其中之一。 It's getting stored as something that's actually below 4.35, hence your result.它被存储为实际上低于 4.35 的东西,因此是你的结果。

When a float is converted to an int the fractional part is truncated, the conversion doesn't take the nearest int to the float in value.float转换为int时,小数部分被截断,转换不会采用最接近intfloat数值。

4.35 can't be exactly represented as a float , the nearest representable number is (we can deduce) very slightly less that 4.35, ie 4.34999... , so when multiplied by 100 you get 434.999... 4.35 不能精确地表示为float ,最接近的可表示数字是(我们可以推断)略小于 4.35,即 4.34999... ,因此当乘以 100 时,您会得到 434.999...

If you want to convert a positive float to the nearest int you should add 0.5 before converting to int .如果要将正float转换为最接近的int ,则应在转换为int之前添加 0.5。

Eg例如

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM