在Java中,从double到int的显式转换是如何循环的?
返回99在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
System.out.println((int)(99.9999999999999));
返回100
你能解释一下原因吗?双精度
文本99。999999999999999
可以表示为双精度,小于100
,因此转换为int
将截断小数部分,结果是99
double
literal99.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