Math.random() 的精度

Posted

技术标签:

【中文标题】Math.random() 的精度【英文标题】:precision of Math.random() 【发布时间】:2011-03-21 15:24:48 【问题描述】:

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

【问题讨论】:

Math.random() 是正确的函数。 对,我就是这个意思。谢谢! 【参考方案1】:

它取决于浏览器/JavaScript 引擎。

可能的最大精度为 52 位,因为Math.random 返回一个介于 0(包括)和 1(不包括)之间的双精度浮点数。此最大值对应于大约 16 位小数,请参阅 Sly1024 的答案。

实际上,许多浏览器给出的精度较低。这似乎是当前状态:

Firefox:完整的 52 个随机位。 V8/Chrome:32 位精度(几年前它曾经低至 30 位,请参阅 https://codereview.chromium.org/1599019) Safari:32 位 IE:?

多次运行以下代码,您会看到在 Chrome 和 Safari 中尾随的 21 位始终为 0。

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

【讨论】:

IE11:52 个随机位,尽管上面的代码有时会给出类似 111000000101010100010110011011110111000111010101110.1 的结果。 Chrome 好像提升了精度,我再也观察不到 21 始终为 0 位了。 Chrome(以及所有基于 Blink 的浏览器和基于 V8 的产品,例如 Electron-apps 和 Node.js)在 2015 年将 Math.random() 精度更新为 128 位。 【参考方案2】:

根据***:Double-precision floating-point format 小数部分是 52 位,我们知道这个数字将介于 0 和 1 之间(我认为不包括 1),所以指数是 -1,剩下 52 个随机位。

52 个随机位为您提供 52 位精度,以 10 为底大约是

52*log10(2) ~= 15.653559774527022151114422525674 digits.

【讨论】:

【参考方案3】:

Math.random() 生成大于等于 0 且小于 1 的 16 位小数的浮点数。

【讨论】:

Javascript 浮点数是 64 位 IEEE 754 值,所以它不是精确 16 位小数。 @volatile: 如果你的精度不是 10 的幂。 @Pointy 这是真的,我的回答不准确。碰撞。 你有这个精度的参考吗?

以上是关于Math.random() 的精度的主要内容,如果未能解决你的问题,请参考以下文章

包含范围内的随机浮点双精度

JavaScript 数字是确定性的吗?

单精度与双精度的区别

Math.random()问题

单精度和双精度有啥不同?

什么叫单精度浮点型?什么叫双精度浮点型?