我对这个有点好奇。Math.random() 给出的值在 [0.0,1.0) 范围内。那么它可以提供的最大价值是多少?换句话说,小于 1.0 的最接近 1.0 的双精度值是多少?
问问题
1692 次
3 回答
6
Java 使用 64 位IEEE-754表示,因此理论上小于 1 的最接近的数字是3FEFFFFFFFFFFFFF
十六进制表示,即 0 表示符号,-1 表示指数,1.9999999999999997 表示 52 位有效数。这大致等于0.9999999999999998
。
参考:IEEE-754 计算器。
于 2013-04-01T02:42:25.750 回答
5
您想要的数字由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。
于 2013-08-21T19:58:07.427 回答
-3
双精度的最小正值是Double.MIN_NORMAL
。因此,小于 1.0 的最大数是1.0-Double.MIN_NORMAL
。
Double.MIN_NORMAL
等于 2 -1022,所以答案仍然非常接近 1.0。您必须将 的值打印1.0-Double.MIN_NORMAL
到小数点后 308 位,然后才能看到除 9 之外的任何内容。
于 2013-04-01T02:36:35.757 回答