日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

js浮点数运算不精确 如何解决_解决 浏览器处理数字运算时精度丢失的方法

發布時間:2025/3/20 HTML 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js浮点数运算不精确 如何解决_解决 浏览器处理数字运算时精度丢失的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

瀏覽器處理數字運算時精度丟失的方法

  • 為什么0.1 + 0.2 不等于0.3。因為計算機不能精確表示0.1, 0.2這樣的浮點數,計算時使用的是帶有舍入誤差的數
  • 并不是所有的浮點數在計算機內部都存在舍入誤差,比如0.5就沒有舍入誤差

1.出現的原因

計算機的二進制實現和位數限制有些數無法有限表示。就像一些無理數不能有限表示,如 圓周率 3.1415926...,1.3333... 等。JS 遵循 IEEE 754 規范,采用雙精度存儲(double precision),占用 64 bit

  • 1位用來表示符號位
  • 11位用來表示指數
  • 52位表示尾數

比如:

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

此時只能模仿十進制進行四舍五入了,但是二進制只有 0 和 1 兩個,于是變為 0 舍 1 入。這即是計算機中部分浮點數運算時出現誤差,丟失精度的根本原因。

大整數的精度丟失和浮點數本質上是一樣的,尾數位最大是 52 位,因此 JS 中能精準表示的最大整數是 Math.pow(2, 53),十進制即 9007199254740992。

9007199254740992?+?1?//?丟失
9007199254740992?+?2?//?未丟失
9007199254740992?+?3?//?丟失
9007199254740992?+?4?//?未丟失

大于 9007199254740992 的可能會丟失精度,看似有窮的數字, 在計算機的二進制表示里卻是無窮的,由于存儲位數限制因此存在“舍去”,精度丟失就發生了

2.如何解決

2.1

在每次計算的時候把小數放到位整數(乘倍數),再縮小回原來倍數(除倍數) 例:

2.2

第一種每次計算都要重復的去乘以和除以使得代碼不美觀,將下面方法封裝到utils工具中每次使用時去調用就可以了,這幾個方法原理上其實和第一種差不多的

//除法
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?accMul((r1/r2),pow(10,t2-t1));
???}
?}????
?//乘法
?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)
?}
//加法
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
}
//減法
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?((arg1*m-arg2*m)/m).toFixed(n);
}
//?console.log(accMul(0.0003,10000))
//?console.log(0.0003*10000)

//?console.log(Subtr(0.999,0.998))
//?console.log(0.999-0.998)

//?console.log(accMul(0.0035,100))
//?console.log(0.0035*100)

//?console.log(accDiv(0.3,0.2))
//?console.log(0.3/0.2)

2.3

引入一些處理數字運算的庫,比如 Math.js 再去調用它提供出來的方法,個人認為如果項目沒有要前端去處理金額之類的可以不用這種


《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的js浮点数运算不精确 如何解决_解决 浏览器处理数字运算时精度丢失的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。