JavaScript - 更精确的圆周率值?

7
我在Chrome控制台中输入Math.PI;,返回如下值:

3.141592653589793

然后我输入Math.PI - 3.141592653589793;,返回0
有没有一种方法可以在Javascript中得到更精确的Math.PI值(例如3.1415926535897932384)?

1
可能不行。你可以尝试自己计算圆周率。 - Madara's Ghost
1
这里有一个兆字节的圆周率,自取:http://newton.ex.ac.uk/research/qsystems/collabs/pi/pi6.txt 但说真的,你想要实现什么目标,使得15位小数不足以满足需求?请注意,在这个范围内的舍入误差是相当显著的。 - Piskvor left the building
1
说真的,将“pi”定义为一个已定义常量确实是有意义的 - 不是因为它会改变,而是因为很难确定适当的源代码表示形式,以便为该数字提供最准确的值。这就是为什么Java和JavaScript具有Math.PI和Math.E final成员变量的原因... - Andy
2个回答

5
我不明白为什么需要高精度的 PI,但你可以选择以下方法之一:
a) 使用 Leibniz formula 自己计算 PI。
b) 使用这个库自己定义 PI。
var PI = new bigdecimal.BigDecimal("3.141592653589793238462643383279");


如果你真的需要,你可以在这里找到 PI 的前100,000位小数。


2
选项(b)对我不起作用:alert(PI == Math.PI); 返回 true,而您断言它不应该是相同的。 - Jongware
1
一个人可以说 var my_pi = 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647; 等等,但最终结果仍然取决于浮点数的最大精度。通常 alert(my_pi); 将会得到 3.141592653589793。如果想要更多小数位数,就需要使用一个数组。但再次强调,这不会是 OP 所要求的 *"Math.PI"*。 - user13500
2
这仍然无法提供更高的精度。由于浮点数限制,3141592653589793238462643383279/10 只能准确到 3.141592653589793 - user13500
抱歉,我还很新手。如果还有错误,请见谅 :p - user3368484
2
"BigDecimal for Javascript是一个纯JavaScript实现的不可变、任意精度、有符号十进制数。" - user3368484

4

在 Javascript 中,最多只能保留15位小数。

因此,您无法获得超过15位的小数。

但是,您可以通过以下方式获得最多20位的小数,但不保证精确性。

Math.PI.toFixed(20); //3.14159265358979311600

这将给你一个带有20位小数的 PI 值。

注意: toFixed() 的最大值为20,最小值为0

因此,尝试使用Math.PI.toFixed(100)会导致错误。


3
可以获得20个小数位,但“11600”不是π的一部分。 - user13500
2
IEEE754双精度浮点数并不总是舍入到15位小数,这是具有误导性的。 - Qantas 94 Heavy
2
实际上,人们认为11600在圆周率中会无限次出现,只是不在那个位置。 :) - user334911

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接