<font id="zqva1"></font>
<rt id="zqva1"></rt>
  • <tt id="zqva1"></tt>
    <cite id="zqva1"></cite>

    <cite id="zqva1"><noscript id="zqva1"></noscript></cite>
      <rp id="zqva1"><meter id="zqva1"></meter></rp>

        <cite id="zqva1"></cite>
          <b id="zqva1"></b>
          <rp id="zqva1"></rp>
          <cite id="zqva1"></cite>

          <rt id="zqva1"></rt>

        1. <rp id="zqva1"></rp>

          js浮點數精度丟失問題_如何解決js中浮點數計算不精準?

          時間:?2017-11-24閱讀:?1453標簽:?js知識

          這篇文章主要講解js中進行數字計算時候,出現的精度誤差的問題。首先從一個面試題來講解:

          console.log(0.1+0.2===0.3);//false
          console.log(0.1+0.1===0.2);//true

          上面第一個的輸出會超出我們的常識,正常應該為true,這里為什么會是false呢,直接運行會發現0.1+0.2在js中計算的結果是:

          console.log(0.1+0.2);//輸出0.30000000000000004

          這對于浮點數的四則運算(加減乘除),幾乎所有的編程語言都會出現上面類似的精度誤差問題,只是大部分語言都處理封裝了避免誤差的方法。對于js而言,由于它是一門弱類型的語言,所以并沒有對浮點數的運算有解決的封裝方法,這能我們自己來解決。這里為什么會出現這個精度誤差呢?


          浮點數產生的原因  

          我們首先就想到計算機能讀懂的是二進制,所以我們進行運算的時候,實際上是把數字轉換為了二進制進行的,所以我們把0.1和0.2轉換為二進制:

          0.1 => 0.0001 1001 1001 1001..(無限循環) 
          0.2 => 0.0011 0011 0011 0011…(無限循環)

          這里可以看出轉換為二進制是一個無限循環的數字,單在計算機中對于無限循環的數字會進行舍入處理的,進行雙精度浮點數的小數部分最多支持52位。然后把兩個2進制的數進行運算得出的也是一個二進制數值,最后再把它轉換為十進制。保留17位小數,所以0.1+0.2的值就成了 0.30000000000000004。  0.1+0.1的值成了0.20000000000000000,全是0的時候可以省略,就成了0.2


          解決浮點數精度誤差的辦法

          最簡單的處理,通過toFixed方法,

          console.log(parseFloat(0.1+0.2).toFixed(1));//輸出0.3

          說明:通過toFixed(num)方法來保留小數,其中num為保留小數的位數,這個方法是根據四舍五入來保留小數的,所以計算的結果并不是最精確的。所以我們需要采用其它方法來實現,通過Number.prototype的屬性進行添加,如下:


          js加法:

          //加法函數 
          function accAdd(arg1, arg2) {
          	var r1, r2, m;
          	try {
          		r1 = arg1.toString().split(".")[1].length;
          	} catch(e) {
          		r1 = 0;
          	}
          	try {
          		r2 = arg2.toString().split(".")[1].length;
          	}catch(e){
          		r2 = 0;
          	}
          	m = Math.pow(10, Math.max(r1, r2));
          	return(arg1 * m + arg2 * m) / m;
          } //給Number類型增加一個add方法,使用時直接用 .add 即可完成計算。   
          Number.prototype.add = function(arg){      
          	return accAdd(arg, this);  
          };
          console.log(0.1.add(0.2).add(0.3));//等價于0.1+0.2+0.3,輸出0.6
          console.log(0.1+0.2+0.3);//輸出0.6000000000000001


          js減法:

          //減法函數  
          function Subtr(arg1, arg2) {
          	var r1, r2, m, n;
          	try {
          		r1 = arg1.toString().split(".")[1].length;
          	} catch(e) {
          		r1 = 0;
          	}
          	try {
          		r2 = arg2.toString().split(".")[1].length;
          	} catch(e) {
          		r2 = 0;
          	}
          	m = Math.pow(10, Math.max(r1, r2)); //動態控制精度長度             
          	n = (r1 >= r2) ? r1 : r2;
          	return parseFloat(((arg1 * m - arg2 * m) / m).toFixed(n));
          }
          Number.prototype.sub = function(arg) {
          	return Subtr(this, arg);
          };
          console.log(0.6.sub(0.2).sub(0.3));//等價于0.6-0.2-0.3 輸出0.1
          console.log(0.6-0.2-0.3);//輸出:0.09999999999999998


          js乘法:

          //乘法函數 
          function accMul(arg1, arg2) {
          	var m = 0,
          		s1 = arg1.toString(),
          		s2 = arg2.toString();
          	try {
          		m += s1.split(".")[1].length;
          	} catch(e) {}
          	try {
          		m += s2.split(".")[1].length;
          	} catch(e) {}
          	return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
          } 
          Number.prototype.mul = function (arg) {      
          	return accMul(arg, this);  
          };
          console.log(0.1.mul(0.2).mul(0.3)); //等價于0.1 * 0.2 * 0.3 輸出0.006
          console.log(0.1 * 0.2 * 0.3); //輸出:0.006000000000000001


          js除法:

          //除法函數 
          function accDiv(arg1, arg2) {
          	var t1 = 0,
          		t2 = 0,
          		r1, r2;
          	try {
          		t1 = arg1.toString().split(".")[1].length;
          	} catch(e) {}
          	try {
          		t2 = arg2.toString().split(".")[1].length;
          	} catch(e) {}
          	with(Math) {
          		r1 = Number(arg1.toString().replace(".", ""));
          		r2 = Number(arg2.toString().replace(".", ""));
          		return(r1 / r2) * pow(10, t2 - t1);
          	}
          }
          Number.prototype.div = function (arg) {      
          	return accDiv(this, arg);  
          };
          console.log(0.6.div(0.2).div(0.1)); //等價于0.6 / 0.2 / 0.1 輸出30
          console.log(0.6 / 0.2 / 0.1); //輸出:29.999999999999993


          完結~~~~~~~~~~~~


          站長推薦

          1.阿里云: 本站目前使用的是阿里云主機,安全/可靠/穩定。點擊領取2000元代金券、了解最新阿里云產品的各種優惠活動點擊進入

          2.騰訊云: 提供云服務器、云數據庫、云存儲、視頻與CDN、域名等服務。騰訊云各類產品的最新活動,優惠券領取點擊進入

          3.廣告聯盟: 整理了目前主流的廣告聯盟平臺,如果你有流量,可以作為參考選擇適合你的平臺點擊進入

          鏈接: http://www.modern-decoration.com.cn/article/detial/165

          JavaScript的聲明提升

          在JavaScript中,當出現var聲明的變量或者function聲明的函數時,會將該聲明提到當前作用域的前面執行,這便是聲明提升。值得注意的是,只是提升了聲明操作,賦值還是在原來的位置進行。聲明提升包括變量聲明提升和函數聲明提升。

          base91 for javascript

          原理和 base64 是一樣的,ASCII 共有94個可打印字符,base64 使用了其中 64 個,base91 使用了 91 個。

          javascript中什么是句柄?

          一個句柄是指使用的一個唯一的整數值,即一個4字節(64位程序中為8字節)長的數值,來標識應用程序中的不同對象和同類中的不同的實例。

          javascript不可變性是什么?

          不可變性即某個變量在進行了某個操作之后,其本身沒有發生變化,比如對于字符串而言,對字符串的任何操作都會改變字符串本身的值,而是在字符串的基礎上復制出來一個然后再改變,這樣我們就說是不可變的

          為什么javascript不起作用?

          JavaScript是一種屬于網絡的腳本語言,已經被廣泛用于Web應用開發,常用來為網頁添加各式各樣的動態功能,為用戶提供更流暢美觀的瀏覽效果。通常JavaScript腳本是通過嵌入在HTML中來實現自身的功能的。

          javascript怎么判斷按鈕被點擊?

          JavaScript可以通過Event對象的target事件或srcElement(IE瀏覽器支持)來判斷按鈕是否被點擊。Event對象代表事件的狀態,比如事件在其中發生的元素、鍵盤按鍵的狀態、鼠標的位置、鼠標按鈕的狀態。

          javascript由幾部分組成?

          JavaScript有三部分組成。分別為核心(ECMAScript) 、文檔對象模型(DOM)、瀏覽器對象模型(BOM)。這三部分分別描述了該語言的語法和基本對象、處理網頁內容的方法和接口、與瀏覽器進行交互的方法和接口。

          Js輸出方式有哪些?

          在編寫JavaScript代碼的時候, 一定要記住每一句代碼后面都需要添加一個分號, 并且這個分號必須是英文的分號,我們會發現有時候不寫分號程序也能夠運行, 這里并不是因為不需要分號, 而是瀏覽器自動幫助我們添加了分號

          7個常見的 JavaScript 測驗及解答

          我相信學習新事物并評估我們所知的東西對自己的進步非常有用,可以避免了我們覺得自己的知識過時的情況。在本文中,我將介紹一些常見的 JavaScript 知識。請享用!

          JavaScript中“javascript:void(0) ”是什么意思

          expression 是一個要計算的 Javascript 標準的表達式。表達式外側的圓括號是可選的,鑒于規范化,以及養成好習慣,建議寫上去。當我們使用 void 操作符指定超級鏈接時,表達式會被計算但是不會在當前文檔處裝入任何內容。

          內容以共享、參考、研究為目的,不存在任何商業目的。其版權屬原作者所有,如有侵權或違規,請與小編聯系!情況屬實本人將予以刪除!

          文章投稿關于web前端網站點搜索站長推薦網站地圖站長QQ:522607023

          小程序專欄: 土味情話心理測試腦筋急轉彎幽默笑話段子句子語錄成語大全運營推廣

          国产精品高清视频免费 - 视频 - 在线观看 - 影视资讯 - 唯爱网