Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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中,从double到int的显式转换是如何循环的?_Java_Casting - Fatal编程技术网

在Java中,从double到int的显式转换是如何循环的?

在Java中,从double到int的显式转换是如何循环的?,java,casting,Java,Casting,返回99 System.out.println((int)(99.9999999999999)); 返回100 你能解释一下原因吗?双精度文本99。999999999999999可以表示为双精度,小于100,因此转换为int将截断小数部分,结果是99 doubleliteral99.999999999999999999999999999999999999999999具有最接近的实际值100,这里转换为int就是100 System.out.println((int)(99.9999999999

返回99

System.out.println((int)(99.9999999999999));
返回100


你能解释一下原因吗?

双精度
文本
99。999999999999999
可以表示为
双精度
,小于
100
,因此转换为
int
将截断小数部分,结果是
99


double
literal
99.999999999999999999999999999999999999999999
具有最接近的实际值
100
,这里转换为
int
就是
100

System.out.println((int)(99.999999999999999999999999999999999999999));
我在这里使用
100.0
作为
double
文本,比较2个
double
值,看看它们是否完全相同
double

这将打印出:

System.out.println(99.9999999999999);
System.out.println((int)(99.9999999999999));
System.out.println(99.9999999999999 == 100.0);

System.out.println(99.999999999999999999999999999999999999999);
System.out.println((int)(99.999999999999999999999999999999999999999));
System.out.println(99.999999999999999999999999999999999999999 == 100.0);
其中包括浮点文字:

对于包java.lang的ValueClass Float和class Double方法,描述了从浮点数的Unicode字符串表示到内部IEEE 754二进制浮点数表示的正确输入转换的详细信息

并声明:

否则,s被视为在通常的“计算机化科学记数法”中表示精确的十进制值,或被视为精确的十六进制值;然后,从概念上将该精确数值转换为“无限精确”的二进制值,然后按照IEEE 754浮点算法的常用四舍五入至最近规则将其四舍五入至double类型,其中包括保留零值的符号

(强调矿山)


也就是说,该值被四舍五入以产生实际的
双精度
值。

在编译时解析浮点值。javac编译器在将任何代码发送到.class文件之前将该值舍入到100,因为您编写的数字的最准确表示形式不是99.99999999,而是100:您的.0000009999999比99.99999999更接近100(我可能与那里的位数不一致)。我写了一些可能对你有帮助的东西。我编写的任何东西对java的应用都不同于C++(或C++或任何其他使用浮点的语言)

尝试<代码> St.out。PrtLn(99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99)代码>这与铸造无关。如果您只需打印第二个,而不使用强制转换,您会注意到,由于可用的精度,它会输出
100.0
。回答不错!也许你也可以解释为什么写100.0而不是100?试试:System.out.println印刷品true@M.Massias我已经包括了为什么我写了100.0而不是100,以及关于为什么这段代码会以这种方式运行的其他引用和解释。谢谢!所以
(int)((Math.random()*((long)Integer.MAX\u VALUE-Integer.MIN\u VALUE)+Integer.MIN\u VALUE))
选择一个随机整数是个坏主意,因为它几乎从来都不是整数。MAX\u VALUE?要在整个可能的
int
值范围内获得一个随机数,只需使用。
99.9999999999999
99
false
100.0
100
true