1. 程式人生 > >JS浮點計算的問題以及處理

JS浮點計算的問題以及處理

在使用浮點計算的時候明明1.56+0.07=1.63,小學生都會算的,可是計算機為什麼算出來很長一段數字呢?

因為JavaScript 裡的數字是採用 IEEE 754 標準的 64 位雙精度浮點數。該規範定義了浮點數的格式。

不說話直接上程式碼看看:

<div>
  數字1:<input id="input1" name=""> 
</div>
<div>
  數字2:<input id="input2" name="">
</div>
<div>
  <button id="add">+</button>
  <button id="minus">-</button>
  <button id="multiply">*</button>
  <button id="division">\</button>
</div>
  <div id="result">value</div>
  let input1 = document.getElementById('input1');
  let input2 = document.getElementById('input2');
  let btn1 = document.getElementById('add');
  let btn2 = document.getElementById('minus');
  let btn3 = document.getElementById('multiply');
  let btn4 = document.getElementById('division');
  let result = document.getElementById('result');
  //加
  btn1.onclick = function () {
    let ss = parseFloat(input1.value) + parseFloat(input2.value);
    result.innerHTML = ss;
  }
   //減
  btn2.onclick = function () {
    let ss = parseFloat(input1.value) - parseFloat(input2.value);
    result.innerHTML = ss;
  }
  //乘
  btn3.onclick = function () {
    let ss = parseFloat(input1.value) * parseFloat(input2.value);
    result.innerHTML = ss;
  }
  //除
  btn4.onclick = function () {
    let ss = parseFloat(input1.value) / parseFloat(input2.value);
    result.innerHTML = ss;
  }

執行一下加法看看結果~~~

處理方法

重新寫了一些浮點運算的函式或直接擴大倍數運算。

下面以擴大倍數運算舉例子:【原理把小數變成整數,然後做運算處理,再除以放大倍數】

//修改之後的加法
  function Add(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 Minus(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);
  }
  //修改之後的乘法
  function Multiply(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 Division(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);
    }
  }

相關推薦

JS計算的問題以及處理

在使用浮點計算的時候明明1.56+0.07=1.63,小學生都會算的,可是計算機為什麼算出來很長一段數字呢? 因為JavaScript 裡的數字是採用 IEEE 754 標準的 64 位雙精度浮點數。該規範定義了浮點數的格式。 不說話直接上程式碼看看: <div&

JS計算精度問題分析與解決

href 動態控制 hub 截斷 max fix math floating 方案 問題描述 在JS計算四則運算時會遇到精度丟失的問題,會引起諸多問題,看看以下例子: 例如:在chrome控制臺輸入 0.1 + 0.7 輸出結果是 0.7999999999999999 例如

JS計算問題

本文轉自:https://www.cnblogs.com/Stephenchao/p/5743805.html 用js進行浮點數計算,結果可能會“超出預期”,大部分計算結果還是對的,但是我們可不想在計算這麼嚴謹的事情上還有意外的驚喜。比如: 0.3 + 0.6 = 0.89999999

java 計算 處理方案

32位微處理器開始支援浮點運算,java語言自己支援浮點運算。 浮點運算導致的問題有:四捨五入出錯,四則運算出錯,運算結果格式古怪等等。 問題的原因 其實簡單: 1.計算機儲存的數是近似數,同時為了顯示不會太長根據需要會進行適當的舍操作 2.計算機儲存的數是不連續的,這不同

JS 加減乘除運算

動態控制 pan nbsp lac cnblogs oat 浮點 spa log //浮點數加法運算 function FloatAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString(

DSP定點與計算

精度 變量 技術分享 高精 轉換關系 例如 align 進制 給定 在定點DSP芯片中,采用定點數進行數值運算,其操作數一般采用整型數來表示。一個整型數的最大表示範圍取決於DSP芯片所給定的字長,一般為16位或24位。顯然,字長越長,所能表示的數的範圍越大,精度也越高。如無

計算

js浮點計算 方法一: 指定要保留的小數位數 (0.1+0.2).toFixed(1) = 0.3; 這個方法toFixed是進行四捨五入的也不是很精準,對於計算金額這種嚴謹的問題,不推薦使用,而且不通瀏覽器對toFixed的計算結果也存在差異。 方法二:

js 點數計算誤差解決方法

eg:一個整數*一個小數出現的結果是 計算機程式語言裡浮點數計算會存在精度丟失問題(或稱舍入誤差),其根本原因是二進位制和實現位數限制有些數無法有限表示 * 以下是十進位制小數對應的二進位制表示 * 0.1 >> 0.0001 1001 100

js運算精度問題和IEEE754

原文連結 當我們使用一段時間的JS之後會遇到下面這個問題 0.1 + 0.2 === 0.3 // false 我們可以在控制檯裡面看到0.1+0.2輸出的並不是0.3而是0.30000000000000004。那麼為什麼出現這樣的問題呢。 其實

js運算bug的解決辦法

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

python 讀取excel 並將對應生成資料進行處理

1.python 讀取excel 檢簡單 def open_excel(file=u'D:\\python27File\\crmAutoTest\\configFile\\logincase.xlsx'

JS】關於js點數計算精度不準確問題的解決辦法

在專案中計算商品價格的時候再次遇到js浮點數計算出現誤差的問題,以前一碰到這個問題就用tofixed方法進行處理一下,這對於一個程式設計師來說是及其不嚴謹的。 1、發現問題: 在測試js浮點數進行加減乘除計算時,都可能出現問題,如下: console.log(0.1

關於js點數計算精度不準確問題的解決辦法

* ** method ** * add / subtract / multiply /divide * * ** explame ** * 0.1 + 0.2 == 0.30000000000000004 (多了 0.00000000000004) * 0.2 + 0.4 ==

JS點數運算的處理

四捨五入 方法一: 在JS中四捨五入的函式 toFixed(n) , n為要保留的小數位數。 n為0~20,當n超過20的時候,JS會出錯。 如果小數點前和要擷取的前一位都是0時,不會按常理擷取。 var h=0.07 h.toFixed(1)的值為0.0 其實

Javascript優化後的加減乘除(解決js點數計算bug)

說明 眾所周知,js在計算浮點數時候,結果可能會不準確。比如:(在chrome中的運算結果) 2.2 + 2.1 = 4.300000000000001 2.2 - 1.9 = 0.30000000000000027 2.2 * 2.2 = 4.84

學以致用:手把手教你擼一個工具庫並打包釋出,順便解決JS點數計算精度問題

本文講解的是怎麼實現一個工具庫並打包釋出到npm給大家使用。本文實現的工具是一個分數計算器,大家考慮如下情況: $$ \sqrt{(((\frac{1}{3}+3.5)*\frac{2}{9}-\frac{27}{109})/\frac{889}{654})^4} $$ 這是一個分數計算式,使用JS原生也是可

js處理點數計算誤差

眾所周知,浮點計算會產生舍入誤差的問題,比如,0.1+0.2,結果應該是0.3,但是計算的結果並不是如此,而是0.30000000000000004,這是使用基於IEEE754數值的浮點計算的通病,js並非獨此一家,今天我們就來看看js怎麼解決這個誤差的。 以下是針對加減乘除的解決方法: 加法: functi

js href和擊事件處理跳轉

js href和點擊事件處理跳轉<a class="yykf11" href="{:U(‘House/yuyue‘,array(‘esfid‘=>$house[‘esfid‘]))}" datatitle="預約看房">預約看房</a>$().((e){ userte

java基本類型(數值範圍):的底層表示定義,float計算快一些

方法 -1 att ieee754 符號位 無法 字符類 數值計算 小數 Java八種基本類型: 六種數字類型(四個整數型,兩個浮點型), 一種字符類型, 一種布爾型。 詳細例如以下 1、整數:包含int,short,byte,long

cocos2d JS 函數類型相互轉換(字符串、整形、形、布爾值)

賦值 defined 基數 bject 布爾 ring 浮點型 謝謝 val 工作忙好些天了,近段時間抽點空分享一下自己學習JS的一點筆記心得做點記錄,大神勿噴,謝謝! p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0