2014-10-01 56 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,否則使用與浮點數進行等同比較是不好的做法。最好檢查一下值是否在一定的容差範圍內。