關於JavaScript 浮點數及運算精確度調整範例程式碼總結
JavaScript 只有一種數字類型 Number,而且在Javascript中所有的數字都是以IEEE-754標準格式表示的。 浮點數的精確度問題不是JavaScript特有的,因為有些小數以二進位表示位數是無窮的。
十進制 二進位
0.1 0.0001 1001 1001 1001 … 011 0011 0011 …
0.3 0.0100 1100 1100 1100 … 110 …
0.5 0.1
0.6 0.1001 地實際上無法真正的表示'1.1′,而只能做到一定程度上的準確,這是無法避免的精度丟失:1.09999999999999999
在JavaScript中問題還要復雜些,這裡只給一些在Chrome中測試數據:
console.log(1.0-0.9 == 0.1) //false console.log(1.0-0.8 == 0.2) //false console.log(1.0-0.7 == 0.3) //false console.log(1.0-0.6 == 0.4) //true console.log(1.0-0.5 == 0.5) //true console.log(1.0-0.4 == 0.6) //true console.log(1.0-0.3 == 0.7) //true console.log(1.0-0.2 == 0.8) //true console.log(1.0-0.1 == 0.9) //true
那如何來避免這類1.0-0.9 != 0.1 的非bug型問題發生呢?下面給出一種目前用的比較多的解, 在判斷浮點運算結果前對計算結果進行精度縮小,因為在精度縮小的過程總會自動四捨五入:
(1.0-0.9).toFixed(digits) // toFixed() 精度参数digits须在0与20之间 console.log(parseFloat((1.0-0.9).toFixed(10)) === 0.1) //true console.log(parseFloat((1.0-0.8).toFixed(10)) === 0.2) //true console.log(parseFloat((1.0-0.7).toFixed(10)) === 0.3) //true console.log(parseFloat((11.0-11.8).toFixed(10)) === -0.8) //true
寫成一個方法:
//通过isEqual工具方法判断数值是否相等 function isEqual(number1, number2, digits){ digits = digits == undefined? 10: digits; // 默认精度为10 return number1.toFixed(digits) === number2.toFixed(digits); } console.log(isEqual(1.0-0.7, 0.3)); //true //原型扩展方式,更喜欢面向对象的风格 Number.prototype.isEqual = function(number, digits){ digits = digits == undefined? 10: digits; // 默认精度为10 return this.toFixed(digits) === number.toFixed(digits); } console.log((1.0-0.7).isEqual(0.3)); //true
接下來,再來試試浮點數的運算,
console.log(1.79+0.12) //1.9100000000000001 console.log(2.01-0.12) //1.8899999999999997 console.log(1.01*1.3) //1.3130000000000002 console.log(0.69/10) //0.06899999999999999
解:
//加法函数,用来得到精确的加法结果 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 //调用:accAdd(arg1,arg2) //返回值:arg1加上arg2的精确结果 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方法,调用起来更加方便。 Number.prototype.add = function (arg){ return accAdd(arg,this); } //减法函数,用来得到精确的减法结果 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。 //调用:accSub(arg1,arg2) //返回值:arg1减去arg2的精确结果 function accSub(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)); //last modify by deeka //动态控制精度长度 n=(r1>=r2)?r1:r2; return ((arg1*m-arg2*m)/m).toFixed(n); } //除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 //调用:accp(arg1,arg2) //返回值:arg1除以arg2的精确结果 function accp(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类型增加一个p方法,调用起来更加方便。 Number.prototype.p = function (arg){ return accp(this, arg); } //乘法函数,用来得到精确的乘法结果 //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。 //调用:accMul(arg1,arg2) //返回值:arg1乘以arg2的精确结果 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类型增加一个mul方法,调用起来更加方便。 Number.prototype.mul = function (arg){ return accMul(arg, this); } <br>//验证一下: console.log(accAdd(1.79, 0.12)); //1.91 console.log(accSub(2.01, 0.12)); //1.89 console.log(accp(0.69, 10)); //0.069<br>console.log(accMul(1.01, 1.3)); //1.313
改造之後,可以愉快地進行浮點數加減乘除操作了~
🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜 🎜以上是關於JavaScript 浮點數及運算精確度調整範例程式碼總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

這篇文章將為大家詳細講解有關PHP浮點數四捨五入法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。 PHP浮點數四捨五入法概述浮點數在計算機中表示為小數點後跟指數,然而,它們通常以有限位數的近似值存儲。當需要將浮點數四捨五入到特定精度時,有幾種方法可以實現。方法1.round()函數round()函數將浮點數四捨五入為最接近的整數。它接受浮點數和可選的精度參數。例如:$num=1.55;echoround($num);//輸出:2echoround($num,1)

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

PHP作為一種流行的伺服器端腳本語言,在進行浮點數計算時常常會遇到精確度遺失或計算誤差的問題,這些問題可能會對程式的準確性和穩定性造成影響。本文將探討PHP浮點數計算誤差的原因,並提出一些避免策略,同時給予特定的程式碼範例供參考。 1.PHP浮點數計算誤差的原因在計算機中,浮點數是以二進制形式表示的,而二進制並不能精確地表示所有的十進制小數,這就導致了浮點數的精

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest
