Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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
Java 将双精度值显式转换为浮点值并将其存储在双精度变量中_Java_Casting - Fatal编程技术网

Java 将双精度值显式转换为浮点值并将其存储在双精度变量中

Java 将双精度值显式转换为浮点值并将其存储在双精度变量中,java,casting,Java,Casting,如果我创建一个双变量,并为其指定一个表达式,例如(5d/3d),然后显式转换为float,如 double c = (float)(5d / 3d); System.out.println(c); 输出: 1.6666666269302368 它应该给出float数据类型的精度,因为float小于double,所以double变量在存储float值时应该没有问题,但输出是荒谬的。为什么会这样 请帮助我理解这段代码的输出。我无法理解代码中的这个输出。这是因为当你将5和3除时,位模式的排列方

如果我创建一个双变量,并为其指定一个表达式,例如(5d/3d),然后显式转换为float,如

 double c = (float)(5d / 3d);
 System.out.println(c);
输出:

1.6666666269302368
它应该给出float数据类型的精度,因为float小于double,所以double变量在存储float值时应该没有问题,但输出是荒谬的。为什么会这样


请帮助我理解这段代码的输出。我无法理解代码中的这个输出。

这是因为当你将5和3除时,位模式的排列方式,它是一个不精确的浮点值(它是
1.66666
和一个很小的位)。就这么简单。为了证明

float f = (float) (5.0 / 3);
System.out.printf("%f=%s %s=%s%n", f, Float.toHexString(f), 
        (double) f, Double.toHexString(f));
System.out.printf("%s=%s %s=%s%n", f, Float.toHexString(f), 
        (double) f, Double.toHexString(f));
输出是

1.666667=0x1.aaaaaap0 1.6666666269302368=0x1.aaaaaap0
1.6666666=0x1.aaaaaap0 1.6666666269302368=0x1.aaaaaap0

在这两种情况下,您都会注意到位模式是恒定的。

我的Java技能非常生疏,但我认为这里发生的事情是,当您将除法结果转换为浮点值时,您丢掉了一半的精度。然后,当您将它存储在一个
双精度
中并将其传递给
System.out.println
时,
System.out.println
试图将它打印到无数个小数点


但是,由于演员阵容,这些小数位是不准确的<实际上,code>System.out.println发明了它们。尝试删除强制转换,查看得到的结果,或将结果打印为
浮点值
。这两种方法都可以得到更合理的结果。

为什么输出结果是荒谬的?您期望的是什么?我期望输出应该最多为7位小数,即1.66666,这是浮点数据类型的精度。由于float小于double,因此double变量在存储高达7位的十进制数时应该没有问题。这是我的想法,但似乎这个想法是错误的。