奇怪的类型转换

时间:2010-10-25 16:38:18

标签: types

我无法弄清楚以下代码。

int d = 5;
float f = 3.8f;
int ret = d*f;

视频是18,而不是我预期的19。为什么呢?

3 个答案:

答案 0 :(得分:5)

这里有两个问题。第一个是浮点值不是小数,因此3.8f更像是3.79999999999999999999923或类似的东西。第二个是当转换为int时,系统将始终截断小数值,而不是舍入。

因此,如果您可以查看处理器,您会看到它正在进行

3.79999999999999999999923 * 5 = 18.999999999999999999615

然后删除非整数部分:

18

答案 1 :(得分:3)

您遇到了IEEE 754限制。 f不是完全 3.8,它只是微不足道。

答案 2 :(得分:1)

当将整数和浮点数相乘时,如果您没有明确地将它们相互转换,则依赖于您用来为您进行舍入的语言的隐式转换规则。有些语言会截断小数,而有些语言会围绕小数值,以便生成int。在将两种数字类型相乘的情况下,如果您不知道会发生什么,最好明确地转换和舍入,这样您就可以确切知道自己得到了什么。