2010-10-25 77 views
2

我只是无法弄清楚下面的代码。奇怪的类型转换

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

ret是18,而不是我所期望的19。为什么?

+0

使用细胞,地板或圆形操作之一;将类型转换为整数会导致浮点数的截断(在大多数计算机语言中)。 – 2010-10-25 16:41:56

+3

说出你正在使用的是什么编程语言,而不是让人猜测,这是一种很好的形式。 – 2010-10-25 16:46:50

+0

哦,来吧,Pascal,它很明显是C ...或者C++ ...或者Java ...或者C#...或者什么的。 ;-) – StriplingWarrior 2010-10-25 17:20:24

回答

5

这里有两个问题。首先是浮点值不是小数,所以3.8f真的更像3.79999999999999999999923或类似的东西。第二个是当转换为int时,系统将总是截断小数值,而不是四舍五入。

所以,如果你能窥视处理器,你会看到它做

3.79999999999999999999923 * 5 = 18.999999999999999999615 

然后你删除非整数部分:

18 
3

您正在运行到IEEE 754种限制。 f不是恰好是3.8,它只是稍微少一点。

1

将整数和浮点数相乘时,如果没有明确地将一个转换为另一个,则依赖于用于为您进行四舍五入的语言的隐式转换规则。有些语言会截断小数点,而有些语言会舍入十进制值以产生整数。在将两种数字类型相乘的情况下,如果您不知道该期待什么,则最好明确地施放和循环,以便确切知道所得到的结果。