Math.random 可以产生的最大值是多少?

Ven*_*sky 5 javascript floating-point precision

在使用Math.randomjavascript时,我遇到了一个有趣的问题。

根据文档,它产生一个“0到小于1范围内的伪随机数”,但是它可以产生的最大数字是多少,小于1?

我编写了这个愚蠢的代码来尝试获得最高值

maxIteration = 1000000000
value = 0
count = 0
while(value < 1 && count++ < maxIteration) {
    let newValue = Math.random()
    value = value < newValue ? newValue : value
}
console.log('value', value)
console.log('count', count)
Run Code Online (Sandbox Code Playgroud)

我能得到的最高是0.9999999989486876,但它是最高的吗?

raf*_*uto 1

您可以查看数字文档以了解浮点详细信息。

TLDR:数字类型是双精度 64 位二进制格式 IEEE 754 值。数字仅保留小数点后 17 位左右的精度;算术需要四舍五入。

var minValue = Number.MIN_VALUE; // 5e-324
// (1 - minValue) == 1

var maxRandom = 1 - 10e-17; // ~= as 1 - (2e-53)

document.body.innerHTML = 'Number.MIN_VALUE = '+ minValue + '<br>maxRandom = ' + maxRandom;
Run Code Online (Sandbox Code Playgroud)