JavaScript有7種基本類型分別是: Undefined, Null, Boolean, String, Number, Symbol, Object.chrome
對於JS中的Number類型, 不區分整數和浮點數, 浮點數的精度遠遠不如整數, 首先先看一下爲何會出現這個問題, 根據雙精度浮點數的定義, Number類型的有效整數範圍是-0XFFFFFFFFFFF至0X1FFFFFFFFFF,因此沒法精確到超過這個範圍的整數. 函數
解決辦法
1.ES6提供的Number.EPSILON方法性能
function numbersequal(a,b){ return Math.abs(a-b)<Number.EPSILON; } var a=0.1+0.2, b=0.3; console.log(numbersequal(a,b)); //true考慮兼容性的問題了,在chrome中支持這個屬性,可是IE並不支持(筆者的版本是IE10不兼容),因此咱們還要解決IE的不兼容問題。code
Number.EPSILON=(function(){ //解決兼容性問題 return Number.EPSILON?Number.EPSILON:Math.pow(2,-52); })(); //上面是一個自調用函數,當JS文件剛加載到內存中,就會去判斷並返回一個結果,相比if(!Number.EPSILON){ // Number.EPSILON=Math.pow(2,-52); //}這種代碼更節約性能,也更美觀。 function numbersequal(a,b){ return Math.abs(a-b)<Number.EPSILON; } //接下來再判斷 var a=0.1+0.2, b=0.3; console.log(numbersequal(a,b)); //這裏就爲true了
2.把計算數字 提高 10 的N次方 倍 再 除以 10的N次方。N>1.ip
(0.1*1000+0.2*1000)/1000==0.3 //true