Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types 奇怪类型转换_Types - Fatal编程技术网

Types 奇怪类型转换

Types 奇怪类型转换,types,Types,我就是搞不懂下面的代码 int d = 5; float f = 3.8f; int ret = d*f; ret是18,而不是我预期的19。为什么?这里有两个问题。第一个是浮点值不是小数,因此3.8f实际上更像3.7999999999999923之类的东西。第二个是,当转换为整数时,系统将始终截断十进制值,而不是四舍五入 因此,如果你能窥视处理器,你会看到它正在运行 3.79999999999999999999923 * 5 = 18.999999999999999999615 然后删除非

我就是搞不懂下面的代码

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

ret是18,而不是我预期的19。为什么?这里有两个问题。第一个是浮点值不是小数,因此
3.8f
实际上更像
3.7999999999999923
之类的东西。第二个是,当转换为整数时,系统将始终截断十进制值,而不是四舍五入

因此,如果你能窥视处理器,你会看到它正在运行

3.79999999999999999999923 * 5 = 18.999999999999999999615
然后删除非整数部分:

18

您遇到了IEEE 754限制
f
并不完全是
3.8
,它只是稍微少了一点。

当整数和浮点数相乘时,如果你不显式地将它们转换成另一个,你就依赖于你所使用的语言的隐式转换规则来为你进行舍入。有些语言会截断小数,而有些语言会舍入小数以生成整数。在将两种数字类型相乘的情况下,如果您不知道会发生什么,最好是显式地进行强制转换和舍入,以便准确地知道您得到的是什么。

使用ceil、floor或round操作之一;将类型转换为整数会导致浮点数的截断(在大多数计算机语言中)。这是一种很好的形式,说明您正在使用的编程语言,而不是让人们猜测。哦,得了吧,帕斯卡,这显然是。。。或者C++…或者Java。。。或C#。。。或者别的什么