Javascript 数学错误

Javascript 数学错误,javascript,math,floating-point,Javascript,Math,Floating Point,alert(Math.cos(Math.PI/2)) 为什么结果不是精确的零?这是不准确还是某种实现错误?Math.PI/2是PI/2的实际值的近似值。取这个近似值的精确余弦不会得到零。您得到的值是这个精确值的近似值,最高可达基础浮点数据类型的精度 使用一些任意精度库,您可以计算双精度中的pi/2与要计算的精确值之间的差异 0.0000000000000000612323399573676588613032966137500529104874722961... 由于接近其零点的余弦斜率为1,

alert(Math.cos(Math.PI/2))


为什么结果不是精确的零?这是不准确还是某种实现错误?

Math.PI/2
是PI/2的实际值的近似值。取这个近似值的精确余弦不会得到零。您得到的值是这个精确值的近似值,最高可达基础浮点数据类型的精度

使用一些任意精度库,您可以计算双精度中的
pi/2
与要计算的精确值之间的差异

 0.0000000000000000612323399573676588613032966137500529104874722961...

由于接近其零点的余弦斜率为1,因此您可能会期望
pi/2
近似值的余弦近似等于此差值,事实上确实如此。

浮点数通常是近似值。由于浮点数在内存中表示为二进制数乘以指数,因此通常只能表示为
2
幂和的数字

1/3
这样的分数不能写成二进制数,因此没有精确的浮点表示。即使有些数字可以准确地用十进制表示,例如
0.1
,也不能用二进制表示,因此不能用浮点正确表示


PI
是一个无理数,不能用浮点表示,因此会有舍入错误。在不包含公差参数的情况下,不要比较浮点数是否相等

比较计算出的浮点数是否相等几乎总是一个坏主意,因为(正如其他人所说)它们是近似值,并且会出现错误

与其检查a==b,不如检查是否等于对应用程序有意义的阈值,如Math.abs(a-b)<.00001。在任何将数字表示为浮点值的编程语言中,这都是一种很好的做法

如果您将整数存储在浮点变量中,并且只进行加法、减法和乘法,那么它们将保持整数(至少在超出边界之前)。但是,使用trig函数等进行除法将引入必须允许的错误


-注意,pi不能表示为浮点数这一事实与pi是无理的这一事实无关。例如,三分之一是有理数,但不能准确地表示为浮点数。是的,但使用有理数,您至少可以查找(或编写)分数类或类似的类来处理它,虽然我不知道有什么好的方法来处理任意实数。@sven非理性意味着不可能用浮点形式表示,但事实并非如此。你在给后者举一个反例,完全是