JavaScript浮点运算中的跨浏览器一致性

时间:2014-10-01 19:26:42

标签: javascript floating-point

我的目标是拥有一个百分度/弧度的翻译工具。

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; 

Chrome评估以下表达式,如下所示:

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 个答案:

答案 0 :(得分:6)

编程语言不是使用与浮点数进行等效比较的不良做法,除非检查无穷大或NaN。最好检查并查看某个值是否在某个容差范围内。

答案 1 :(得分:3)

ECMAScript标准将“数值”(在技术上没有单独的整数类型)定义为“对应于IEEE 754值的双精度64位二进制形式”。这应该意味着行为在各个实现中是一致的,因为它们必须至少模拟该格式的精确精度。

另一方面,同一实现中的两个不同的操作可能会产生不同的精度错误,因此一般来说,任何浮点实现的确切等式都是有风险的。

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