6

我对这个有点好奇。Math.random() 给出的值在 [0.0,1.0) 范围内。那么它可以提供的最大价值是多少?换句话说,小于 1.0 的最接近 1.0 的双精度值是多少?

4

3 回答 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 回答