Javascript 数学的精确性

Javascript 数学的精确性,javascript,random,Javascript,Random,JavaScript的Math.random()函数的精度是多少?Math.random()生成一个16位小数的浮点数,大于或等于零,小于1。根据维基百科: 分数部分是52位,我们知道数字将在0到1之间(我想不包括1),所以指数是-1,剩下52个随机位 52个随机位提供52位精度,以10为基数大约为 52*log10(2) ~= 15.653559774527022151114422525674 digits. 它依赖于浏览器/JavaScript引擎 最大可能精度为52位,因为Math.ra

JavaScript的
Math.random()
函数的精度是多少?

Math.random()
生成一个16位小数的浮点数,大于或等于零,小于1。

根据维基百科: 分数部分是52位,我们知道数字将在0到1之间(我想不包括1),所以指数是-1,剩下52个随机位

52个随机位提供52位精度,以10为基数大约为

52*log10(2) ~= 15.653559774527022151114422525674 digits.

它依赖于浏览器/JavaScript引擎

最大可能精度为52位,因为
Math.random
返回一个介于0(包含)和1(排除)之间的双精度浮点。这个最大值大约相当于16位小数,参见Sly1024的答案

实际上,许多浏览器给出的精度较小。这似乎是目前的状况:

  • Firefox:完整的52个随机位
  • V8/Chrome:32位精度(几年前它曾低至30位,请参阅)
  • Safari:32位
  • IE:
将下面的代码运行几次,您将看到在Chrome和Safari中,后面的21位始终是0


console.log((Math.random()*Math.pow(2,53)).toString(2))

Math.random()
是正确的函数。对,这就是我的意思。谢谢Javascript浮点数是64位IEEE 754值,所以它不是精确的16位小数。@volatile:如果精度不是10的幂。@Pointy这是真的,我的答案不精确。bump.你有关于这个精度的参考吗?IE11:52个随机位,尽管上面的代码有时会给出类似
11100000010101010001011001101111011100011101110.1
的结果。Chrome似乎已经提高了它们的精度,但我无法再观察21个0位。Chrome(作为扩展,所有基于Blink的浏览器和基于V8的产品,如Electron apps和Node.js)在2015年将Math.random()精度更新为128位。