我的目标是拥有一个百分度/弧度的翻译工具。
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
答案 0 :(得分:6)
编程语言不是使用与浮点数进行等效比较的不良做法,除非检查无穷大或NaN。最好检查并查看某个值是否在某个容差范围内。
答案 1 :(得分:3)
ECMAScript标准将“数值”(在技术上没有单独的整数类型)定义为“对应于IEEE 754值的双精度64位二进制形式”。这应该意味着行为在各个实现中是一致的,因为它们必须至少模拟该格式的精确精度。
另一方面,同一实现中的两个不同的操作可能会产生不同的精度错误,因此一般来说,任何浮点实现的确切等式都是有风险的。
因此最好使用“epsilon”值,也许将其包含在名为Utils.isSufficientlyEqualTo
之类的库函数中。