我对此有点好奇。 Math.random()在[0.0,1.0)范围内给出一个值。那么它最大的价值是什么?换句话说,什么是1.0的最接近的double值,小于1.0?Java:Math.random()最大值(双精度小于1)
回答
Java使用64位IEEE-754表示,所以最接近的数量小于一个理论上3FEFFFFFFFFFFFFF
十六进制表示,这对于符号为0,对于指数为-1,对于52位有效位为1.9999999999999997。这大致等于0.9999999999999998
。
参考文献:IEEE-754 Calculator。
双数的最小正值为Double.MIN_NORMAL
。所以,小于1.0的最大数字是1.0-Double.MIN_NORMAL
。
Double.MIN_NORMAL
等于2 -1022,所以答案是仍然极其接近1.0。你必须要打印的1.0-Double.MIN_NORMAL
到308位小数的价值之前,你可以看到什么,但9
奇怪的是,当我在System.out.println中包装'1.0 - Double.MIN_NORMAL == 1.0'时,我变为true。但是当我在System.out.println中包含0.9999999999999999时,我得到了错误。那么这是否意味着0.9999999999999999是最接近的两倍? – Justin
哼...不,所以,MIN_NORMAL适用于值_closest到零_这是IEEE-754值上可能出现的最小错误。但是,因为你走向1,一些精度会丢失! – mjv
'System.out.println(Double.MinNormal)'给出了2.2250738585072014E-308。很小。 – Justin
你想要的数字是由Math.nextAfter(1.0, -1.0)
返回的。
该函数的名称有点用词不当。 Math.nextAfter(a, 1.0)
返回至少两倍值大于a
(即,a
之后的下一个值),并返回Math.nextAfter(a, -1.0)
,其小于a
最大值(即,值之前a
)。
注:另一张海报说,1.0-Double.MIN_NORMAL
。这是错误的。 1.0-Double.MIN_NORMAL
正好等于1.0。
- 1. 机器精度以及双精度型的最大值和最小值
- 2. 在双精度上的最大值和最小值的正则表达式
- 3. 如何计算IEEE扩展双精度的最小值和最大值?
- 4. Fortran 90中双精度最大的数组大小是多少?
- 5. OpenCL中最小/最大浮点数或双精度常数
- 6. 双精度浮点格式的最大和最小指数
- 7. 双精度值
- 8. 找到最大双精度值的最有效算法
- 9. 将双精度值格式化为小数点后1位
- 10. 如何以最小精度格式化双精度
- 11. 对于IEEE 754双精度数字,长度为1的范围包含最多的双精度数?
- 12. 查找最大的5值小于1,最小的5个值
- 13. 如何确定双精度的最大精度
- 14. 可能影响双精度的最大小数位数
- 15. 获取双精度值的小数位
- 16. .NET:双精度值
- 17. TryParse双精度值
- 18. 输出精度高于双精度
- 19. round QDec双精度值,最多两个字符的精度
- 20. .NET Web API返回大量小数位后的双精度值
- 21. 使用刻度和精度计算小数的最大值
- 22. 如何在范围0 -1中获得双精度的最佳精度?
- 23. 单精度大端浮点值到Python浮点数(双精度,大端)
- 24. 精度取决于图像大小
- 25. 这些双精度值如何精确到20位小数?
- 26. 双精度浮点值传递双精度时
- 27. 错精度双重价值
- 28. 双精度值返回0
- 29. Python中的双精度值
- 30. J2ME双精度值问题
关于0.9999999999999999呢?它有相同的数字位数,但是最后有一个9而不是8。当我'System.out.println(0.9999999999999999 - 0.9999999999999998)',我得到:1.1102230246251565E-16 – Justin
@gangqinlaohu最后一位数字不准确。我截取了从IEEE-754计算器获得的数字(请参阅答案中的链接)以获取数字。 8之后的下一个数字也是8,所以如果应用舍入,结果变为0.9999999999999999。 – dasblinkenlight
呵呵,所以0.9999999999999999比0.9999999999999998更接近,因为0.9999999999999998被截断了,所以最靠近1的Double是0.9999999999999999。 – Justin