2014-10-01 57 views
2

我的目标是拥有一个百倍度/弧度转换工具。JavaScript浮点运算中的跨浏览器一致性

var PI  = 3.1415926535897936; 
var PI_100 = 1.5707963267948968; // PI*0.5; 
var PI_300 = 4.71238898038469; // PI*(1.5); 
var D_PI = 6.283185307179587; // 2*pi 

var centTo = 0.015707963267948967; 

铬评估以下表达式如下所示:

PI*2 == D_PI  >>> true 
PI*0.5 = PI_100 >>> true 
PI*1.5 = PI_300 >>> true 

100*centTo == PI_100 >>> true 
300*centTo == PI_300 >>> true 

难道这些表达式总是true在每一个浏览器?

或者在比较时是否必须使用epsilon?

var epsilon = 0.0000001; 
Math.abs(a - b) < epsilon 
+2

只是感兴趣,为什么你没有使用'Math.PI'? – 2014-10-01 19:33:15

+1

如果你打算在这个水平上做数学 – 2014-10-01 19:37:22

+0

@LeshaOgonkov因为Math.PI是3.141592653589793,如果你制作了D_PI = 2 * Math.PI,那么D_PI = = 2 * Math.PI是假的!但'我的'PI * 2 =='我的'D_PI结果为true .... – civiltomain 2014-10-01 20:10:06

回答

3

ECMAScript标准定义了一个“数值”(技术上没有单独的整数类型),“对应于IEEE 754值的双精度64位二进制格式”。这应该意味着这些行为在实现中是一致的,因为它们必须至少模拟该格式的精确度。另一方面,在相同的实现内的两个不同的操作可能产生不同的精度误差,所以通常精确的等式对于任何浮点实现都是有风险的。

因此,最好使用“epsilon”值,也许将其包装在名为Utils.isSufficientlyEqualTo之类的库函数中。

6

不管是编程语言,除非检查无穷大或NaN,否则使用与浮点数进行等同比较是不好的做法。最好检查一下值是否在一定的容差范围内。