alert(Math.cos(Math.PI/2));
为什么结果不准确为零?这是不准确的,还是一些实现错误?
答案 0 :(得分:11)
Math.PI/2
是pi/2
的实际值的近似值。取这个近似值的精确余弦不会产生零。您获得的值是此精确值的近似值,直到基础浮点数据类型的精度。
使用一些任意精度库,您可以评估双精度pi/2
与精确值之间的差异
0.0000000000000000612323399573676588613032966137500529104874722961...
由于余弦的斜率接近零,你会发现pi/2
近似值的余弦近似等于这个差值,实际上它是。
答案 1 :(得分:2)
浮点数通常是近似值。由于浮点数在内存中表示为二进制数乘以指数,因此通常只能表示2
幂的总和。
1/3
之类的分数不能写为二进制数,因此没有准确的浮点表示。甚至一些可以用十进制精确编写的数字,例如0.1
,也不能用二进制精确表示,因此不能在浮点中正确表示。
PI
是一个无理数,不能表示为浮点数,因此会出现舍入错误。如果不包括容差参数,请不要将浮点数相等。 This link has a good explanation of the basics.
答案 2 :(得分:0)
比较计算出的相等浮点数几乎总是一个坏主意,因为(正如其他人所说)它们是近似值,并且出现错误。
不是检查== b,而是检查相等于适合您的应用程序的阈值,如Math.abs(a-b)< 0.00001。在任何将数字表示为浮点值的编程语言中,这都是一种很好的做法。
如果你将整数存储在浮点变量中,只是加,减和乘,它们将保持整数(至少在它们越界之前)。但是,使用trig函数等进行划分会引入必须允许的错误。
-m @