1. 程式人生 > >先貼個JS精度計算的吧

先貼個JS精度計算的吧

問題這樣的:
37.5*5.5=206.08 (JS算出來是這樣的一個結果,我四捨五入取兩位小數)
我先懷疑是四捨五入的問題,就直接用JS算了一個結果為:206.08499999999998
怎麼會這樣,兩個只有一位小數的數字相乘,怎麼可能多出這麼小數點出來。
我Google了一下,發現原來這是JavaScript浮點運算的一個bug。
比如:7*0.8 JavaScript算出來就是:5.6000000000000005
網上找到了一些解決辦法,就是重新寫了一些浮點運算的函式。
下面就把這些方法摘錄下來,以供遇到同樣問題的朋友參考:

程式程式碼

//除法函式,用來得到精確的除法結果
//說明:javascript的除法結果會有誤差,在兩個浮點數相除的時候會比較明顯。這個函式返回較為精確的除法結果。
//呼叫:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精確結果

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型別增加一個div方法,呼叫起來更加方便。
Number.prototype.div = function (arg){
return accDiv(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);
}
//加法函式,用來得到精確的加法結果
//說明: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);
}

在你要用的地方包含這些函式,然後呼叫它來計算就可以了。
比如你要計算:7*0.8 ,則改成 (7).mul(8)
其它運算類似,就可以得到比較精確的結果。

------------------------------------------------------------------------------------------------------------------------------------------------------------
以上是在網上一個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));
     //last modify by deeka
     //動態控制精度長度
     n=(r1>=r2)?r1:r2;
     return ((arg1*m-arg2*m)/m).toFixed(n);
}  

相關推薦

JS精度計算

問題這樣的: 37.5*5.5=206.08 (JS算出來是這樣的一個結果,我四捨五入取兩位小數) 我先懷疑是四捨五入的問題,就直接用JS算了一個結果為:206.08499999999998 怎麼會這樣,兩個只有一位小數的數字相乘,怎麼可能多出這麼小數點出來。 我Go

js精度計算問題(減法,真實bug)

今天寫計算的時候,出現的bug 後面補救了一下。 accSub = (num1, num2) => { let r1; let r2; try { r1 = num1.toString().split('.')[1].leng

JS數字計算精度問題解決

try sub style 題解 會有 str add col eee 1 add(a, b) {//相加 2 var c, d, e; 3 try { 4 c = a.toString(

黃聰:JS數學計算精度修正

function 浮點數 turn 計算 filesize add follow fun his 問題描述 如果我問你,4330.61乘以100等於多少,我猜你肯定跟我說:“肯定是 433061”啊! 是啊,要我我也是這麽回答,來來來我們

three.js入門——旋轉的正方體

WebGl中文網看了幾篇教程,又百度了幾篇文章,頓時感覺手癢,開啟編輯器,寫個demo玩玩。 demo是寫在vue專案中的,所以首先: npm install three --save; npm install tween --save; 安裝依賴包(目前階段tween用不上,但是先一起

JS中浮點數精度計算(轉)

先貼原文地址 http://xieyufei.com/2018/03/07/JS-Decimal-Accuracy.html問題的發現  總結了一下,一共有以下兩種問題浮點數運算後的精度問題  在計算商品價格加減乘除時,偶爾會出現精度問題,一些常見的例子如下:12345678

js前臺計算日期的間隔時間(時間差)

在後臺傳來兩個時間欄位,從中解析出兩個字串型別的日期格式 需要在前臺解析出兩個時間的間隔 這裡採用獲取兩個日期的時間戳進行計算 時間戳是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數。 所以要求兩個

這裡是MYSQL操作的C語言程式碼,我,你們看

#include <stdio.h>#include <string.h> #include <windows.h>#include <mysql.h> int main(void ){  int id;  MYSQL mysq

判斷兩精度浮點數是否整除!

防止 src 溢出 客戶端 market nbsp 道理 有效 無法   這幾天在開發公司項目中,由於屬於期貨產品,所以在此過程中遇到價格和最小單位價格的除法計算。 眾所周知浮點數在計算機中為近視值。比如價格,客戶端輸入的價格為145.5,但是我的服務端斷點顯示為145.4

Python 微信通知

source left amp nbsp https clas 信息 play isp 桑心病狂,試試把報警信息發到微信上 原文 https://segmentfault.com/a/1190000009717078 Python 微信通知 先挖個坑

js混合計算字符串字節長度

mat length 混合 調用 字節 blog str null logs js混合計算字符串字節長度 function getBt(str) { if (str.length > 0) { var char = str.match

Java踩坑筆記:ObjectIOStream與IOStream的各種裝飾器(坑,以後再來詳細填)

ted objects lose val read thread 環境 valid 序列化對象 Java的序列化和ObjectStream真是一個大坑。。 先不說多線程環境下的問題,在單線程裏,一個Socket只能保持一個ObjectOutputStream,原因好像是

js 小數計算為啥和想象中不一樣!

++ fix 我只 font 解決辦法 都沒有 丟失 解決辦法。 所有 今天遇到了一個比較有趣的事,如果要你計算0.1+0.2等於多少你會怎麽回答? “0.3啊!”你可能都不會考慮。我也一樣,當a=0.1,b=0.2時 if(a+b === 0.3){

圖片拖拽的繼承,引用 1 (需要引入2,3兩js才能運行)

type left set height har title back 運行 fun <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <

js-小數計算問題

部分 二次 www. get class tle 計算 技術分享 .com 先上圖: 什麽情況? 原因:js采用二進制進行小數計算 先看十進制的小數轉換為二進制的方法: 十進制數的整數位是二進制數的整數位,十進制數的小數位是二進制數的小數位 假如我們有小數111.4(10

51nod 1873 高精度計算

分享 bsp 技術分享 exti big ros public ++ lin JAVA BigDecimal import java.util.*; import java.math.*; public class Main { public stat

php高精度計算問題

cnblogs turn tin 浮點型 style 相加 bcmul -1 計算 從事金融行業,資金運算頻繁,這裏說下我遇到的坑....稍不留神,用戶資金可能損失幾十萬,甚至更可怕......直接上實例吧: javascript 0.1 + 0.2 為啥不等於 0.3 ?

最近在寫一些樹上的東西,發一波LCA的

++ html str long ace efi algorithm quest http 不會樹剖的我只有去學tarjan和倍增了,個人覺得倍增比tarjan好打一點。。。 tarjan學習的地方 http://www.cnblogs.com/JVxie/p/485471

前端表單驗證常用的15JS正則表達式

ntp html 正整數 手機號碼 表達式 浮點數 als 浮點 個數 在表單驗證中,使用正則表達式來驗證正確與否是一個很頻繁的操作,本文收集整理了15個常用的javaScript正則表達式,其中包括用戶名、密碼強度、整數、數字、電子郵件地址(Email)、手機號碼、身份證

JS的不好設計

異常 如果 body def logs pan urn ali 後端 1.相等判斷 if(a){} 相當於 if(a == ture){} 然而下面的相等判斷都為true 0 == false "" == false "false"