【轉】javascript 小數乘法結果錯誤處理

来源:http://www.cnblogs.com/xhtml5/archive/2016/07/27/5712168.html
-Advertisement-
Play Games

一、用js計算 12.32 * 7 結果是多少? 答案:86.24000000000001 為什麼會出現這種問題?怎麼解決? js在處理小數的乘除法的時候有一個bug,解決的方法可以是:將小數變為整數來處理。 以上的計算可以改為: 12.32 * 100 * 7 /100 得出的結果是:86.24, ...


一、用js計算 12.32 * 7  結果是多少? 答案:86.24000000000001   為什麼會出現這種問題?怎麼解決? js在處理小數的乘除法的時候有一個bug,解決的方法可以是:將小數變為整數來處理。 以上的計算可以改為: 12.32 * 100 * 7 /100 得出的結果是:86.24,正確。   另外再計算一下: 8.80 * 100 * 12 / 100 結果:105.60000000000002 38.80也會出現類似的問題。   精確度增加10倍: 8.80 * 1000 * 12 / 1000 結果:105.6 正常了。   16.40 * 1000000 * 6 / 1000000 結果也有問題   為了讓js執行的更準確,在以後的js小數計算中直接將值擴大10000倍,再除以10000,就可以解決問題。 var num = 38.80; var num2 = 13; alert(num * 10000 * 12 / 10000);   被乘和除的這個數經過測試10000最合適,小了有些數字出問題,大了(1000000)有些數字也出問題。 二、
 1 <script>
 2 Number.prototype.rate=function(){
 3 varoStr=this.toString();
 4 if(oStr.indexOf(".")==-1)
 5 return1;
 6 else
 7 returnMath.pow(10,parseInt(oStr.length-oStr.indexOf(".")-1));
 8 }
 9  
10 functiontran(){
11 args=tran.arguments;
12 vartemp=1;
13 for(i=0;i<args.length;i++)
14 temp*=args[i]*args[i].rate();
15 for(i=0;i<args.length;i++)
16 temp/=args[i].rate();
17 returntemp
18 }
19  
20 alert(tran(11,22.9));
21  
22 </script>

 

  該解決 辦法是比較麻煩的辦法,但是卻能讓你大概瞭解解決這個問題的實際過程。  
 1 //除法函數,用來得到精確的除法結果
 2 //說明:javascript的除法結果會有誤差,在兩個浮點數相除的時候會比較明顯。這個函數返回較為精確的除法結果。
 3 //調用:accDiv(arg1,arg2)
 4 //返回值:arg1除以arg2的精確結果
 5 function accDiv(arg1,arg2){
 6 var t1=0,t2=0,r1,r2;
 7 try{t1=arg1.toString().split(".")[1].length}catch(e){}
 8 try{t2=arg2.toString().split(".")[1].length}catch(e){}
 9 with(Math){
10 r1=Number(arg1.toString().replace(".",""))
11 r2=Number(arg2.toString().replace(".",""))
12 return (r1/r2)*pow(10,t2-t1);
13 }
14 }
15  
16 //給Number類型增加一個div方法,調用起來更加 方便。
17 Number.prototype.div = function (arg){
18 return accDiv(this, arg);
19 }
20  
21 //乘法函數,用來得到精確的乘法結果
22 //說明:javascript的乘法結果會有誤差,在兩個浮點數相乘的時候會比較明顯。這個函數返回較為精確的乘法結果。
23 //調用:accMul(arg1,arg2)
24 //返回值:arg1乘以 arg2的精確結果
25 function accMul(arg1,arg2)
26 {
27 var m=0,s1=arg1.toString(),s2=arg2.toString();
28 try{m+=s1.split(".")[1].length}catch(e){}
29 try{m+=s2.split(".")[1].length}catch(e){}
30 return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
31 }
32  
33 // 給Number類型增加一個mul方法,調用起來更加方便。
34 Number.prototype.mul = function (arg){
35 return accMul(arg, this);
36 }
37  
38 //加法函數,用來得到精確的加法結果
39 //說明:javascript的加法結果會有誤差,在兩個浮點數相加的時候會比較明顯。這個函數返回較為精確的加法結果。
40 //調用:accAdd(arg1,arg2)
41 // 返回值:arg1加上arg2的精確結果
42 function accAdd(arg1,arg2){
43 var r1,r2,m;
44 try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
45 try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
46 m=Math.pow(10,Math.max(r1,r2))
47 return (arg1*m+arg2*m)/m
48 }
49  
50 //給Number類型增加一個add方法,調用起來更加方便。
51 Number.prototype.add = function (arg){
52 return accAdd(arg,this);
53 }
54  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ECMAScript 變數:1.基本類型值(簡單數據段) 2.引用類型值(可能由過個值構成的對象) → 保存在記憶體中的對象 動態屬性: 只能給引用型值動態添加新屬性,以便將來使用。 複製變數值 : 基本類型值的複製 → 在變數對象上創建一個新值 → 複製給新變數(互不影響) 引用類型值的複製 → 將 ...
  • 序 聽過JS,聽過Node,也聽過Node.js,還聽過npm,然而並不是很清楚的知道都代表什麼,這兩天調介面,然後前端同學很忙,就自己把前端代碼拿過來跑了,也趁機瞭解一下這幾個概念,下邊做個小的總結吧。 Node和Node.js JS就不用說了,一種解釋型語言,前端用的較多,目前也出現在伺服器端。 ...
  • 首先,在製作網頁中,想實現在點擊提交按鈕後,根據當前按鈕的不同,將按鈕信息附加到鏈接的後邊,如下圖所示: 上圖中,鏈接後的id=LJQ,就是實現帶參數跳轉,之後便於在跳轉頁根據id=X;根據x不同,實現不同載入圖片等內容; 接下來是如何實現帶參數跳轉: 接下來講解,如何對帶參數鏈接進行解析呢? 解釋 ...
  • 1.閃現方式的輪播 不論述,實現比較簡單,效果也比較好 2.滑動輪播 以下麵的html代碼為例(向左滑動) 插件源碼:實現向左和向上輪播,手動切換也是向左和向上切換(手動切換關鍵源碼) 滑動輪播的實現方式主要有兩種 1)切換父元素margin-left,將第一個子元素不斷添加到父容器結尾 簡單實現 ...
  • 前端能獲得的時間有兩種:客戶端與伺服器的時間. 如何獲取伺服器當前時間,主要是處理客戶端本地機器時間錯誤問題。 方法一:原理:獲取伺服器返回的頭部信息中的Date屬性 由於得到的是GMT(格林尼治時間) 所以要轉換成東八區的時間 這個就是響應伺服器的當前時間。var date = new Date( ...
  • ...
  • 1. viewport:也就是可視區域。對於桌面瀏覽器,我們都很清楚viewport是什麼,就是出去了所有工具欄、狀態欄、滾動條等等之後用於看網頁的區域,這是真正有效的區域。由於移動設備屏幕寬度不同於傳統web,因此我們需要改變viewport; 實際上我們可以操作的屬性有4 個: width - ...
  • 1 <meta content=”width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;” name=”viewport” /> <meta content=”yes” name=”apple-mobile ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...