Math.random() 的精度
Posted
技术标签:
【中文标题】Math.random() 的精度【英文标题】:precision of Math.random() 【发布时间】:2011-03-21 15:24:48 【问题描述】:javascript 的Math.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() 的精度的主要内容,如果未能解决你的问题,请参考以下文章