最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解JS-- 浮點(diǎn)數(shù)運(yùn)算處理

 更新時(shí)間:2016年11月28日 08:25:14   作者:我有一顆四葉草  
本篇文章主要介紹了JS--浮點(diǎn)數(shù)運(yùn)算處理,現(xiàn)在分享給大家,也給大家做個(gè)參考。感興趣的小伙伴們可以參考一下。

一. 問(wèn)題描述

最近在做一個(gè)項(xiàng)目,頁(yè)面上會(huì)存在一些JS浮點(diǎn)數(shù)的運(yùn)算,發(fā)現(xiàn)JS浮點(diǎn)數(shù)運(yùn)算存在一些bug.譬如:

0.1+0.2 == 0.30000000000000004
 
0.1 + 0.7 == 0.7999999999999999
 
7*0.8 == 5.6000000000000005
 
5.6/7 == 0.7999999999999999

二.解決方案   

JS運(yùn)算后都會(huì)有很小的誤差. 不像.Net或者Java那樣準(zhǔn)確. 主要是JS重點(diǎn)不在運(yùn)算上面,可是有時(shí)候項(xiàng)目一定要用到.想了一下大概有兩種解決方案

A 方案一:

運(yùn)算結(jié)果保留2-3位小數(shù)位數(shù). 前端界面一般用到的運(yùn)算比較少。精度要求不會(huì)太高。 所以取2位小數(shù)位即可。

B. 方案二:

將小數(shù)位數(shù)轉(zhuǎn)換為整數(shù)運(yùn)算. 譬如:

0.1+0.2 =》 (1+2)/10 == 0.3
 
0.1 + 0.7 =》 (1+7)/10 == 0.8
 
7*0.8 == (7*8)/10 == 5.6
 
5.6/7 == (56/7)/10 == 0.1

為了方便調(diào)用. 所以我們可以提取一個(gè)公共的方法出來(lái).譬如下面的JSMath庫(kù),JSMath重寫了加減乘除. 會(huì)先將參數(shù)轉(zhuǎn)換為整數(shù)再運(yùn)算JSMath(參數(shù)1).操作(參數(shù)2)

參數(shù)1和參數(shù)2分別就是運(yùn)算的第一個(gè)Number和第二個(gè)Number. 計(jì)算后通過(guò)Value屬性獲取值.

 (function() {
 
  var JSMath = function() {
    return this;
  }
 
  JSMath.prototype.from = function(value) {
 
    // 支持JSMath參數(shù)傳遞主要是用于嵌套的調(diào)用
    if ((typeof(value) == 'object') && (value.value != undefined)) {
      this.value = value.value;
    } else {
      this.value = value;
    }
    return this;
  }
 
  // 加法
  JSMath.prototype.add = function(value) {
    var thisValueString = this.value.toString();
    var valueString = value.toString();
    var timesCount1 = 0;
    var timesCount2 = 0;
    if (thisValueString.indexOf('.') > 0) {
      timesCount1 = thisValueString.split('.')[1].length;
    }
    if (valueString.indexOf('.') > 0) {
      timesCount2 = valueString.split('.')[1].length;
    }
    var maxtimeCount = timesCount1 > timesCount2 ? timesCount1 : timesCount2;
    this.value = (Math.pow(10, maxtimeCount) * this.value + Math.pow(10, maxtimeCount) * value) / Math.pow(10, maxtimeCount);
    return this;
  }
   
 // 減法
  JSMath.prototype.sub = function(value) {
    var thisValueString = this.value.toString();
    var valueString = value.toString();
    var timesCount1 = 0;
    var timesCount2 = 0;
    if (thisValueString.indexOf('.') > 0) {
      timesCount1 = thisValueString.split('.')[1].length;
    }
    if (valueString.indexOf('.') > 0) {
      timesCount2 = valueString.split('.')[1].length;
    }
    var maxtimeCount = timesCount1 > timesCount2 ? timesCount1 : timesCount2;
    this.value = (Math.pow(10, maxtimeCount) * this.value - Math.pow(10, maxtimeCount) * value) / Math.pow(10, maxtimeCount);
    return this;
  }
 
  // 除法  
  JSMath.prototype.div = function(value) {
    var thisValueString = this.value.toString();
    var valueString = value.toString();
    var timesCount1 = 0;
    var timesCount2 = 0;
    if (thisValueString.indexOf('.') > 0) {
      timesCount1 = thisValueString.split('.')[1].length;
    }
    if (valueString.indexOf('.') > 0) {
      timesCount2 = valueString.split('.')[1].length;
    }
    var maxtimeCount = timesCount1 > timesCount2 ? timesCount1 : timesCount2;
    this.value = ((Math.pow(10, maxtimeCount) * this.value) / (Math.pow(10, maxtimeCount) * value));
    return this;
  }
 
  // 乘法
  JSMath.prototype.times = function(value) {
 
    var thisValueString = this.value.toString();
    var valueString = value.toString();
    var timesCount1 = 0;
    var timesCount2 = 0;
    if (thisValueString.indexOf('.') > 0) {
      timesCount1 = thisValueString.split('.')[1].length;
    }
    if (valueString.indexOf('.') > 0) {
      timesCount2 = valueString.split('.')[1].length;
    }
    var maxtimeCount = timesCount1 > timesCount2 ? timesCount1 : timesCount2;
    this.value = (Math.pow(10, maxtimeCount) * this.value * Math.pow(10, maxtimeCount) * value) / Math.pow(10, maxtimeCount * 2);
    return this;
  }
 
  if (window.JSMath == undefined) {
    window.JSMath = function(value) {
      var result = new JSMath();
      result.from(value);
      return result;
    }
  }
})()

B1.基本運(yùn)算

  0.1+0.2
=> JSMath(0.1).add(0.2).value == 0.3
 
7+0.8
=> JSMath(7).times(0.8).value == 5.6
 
5.6/7
=> JSMath(5.6).div(7).value = 0.8

B2.多目運(yùn)算

  0.05 + 0.05 + 0.2
=> JSMath(JSMath(0.05).add(0.05)).add(0.2).value == 0.3
 
(5+0.6)/7
=> JSMath(JSMath(5).add(0.6)).div(7).value == 0.8

三.小總結(jié)

上面自己自己暫時(shí)知道的一些解決方案.不太清楚是否有開(kāi)源的更可靠的三方庫(kù)來(lái)解決這個(gè)問(wèn)題。以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

京山县| 云阳县| 河北区| 天镇县| 铜陵市| 鄄城县| 尚志市| 银川市| 昌都县| 临桂县| 安阳县| 崇左市| 上思县| 读书| 祁连县| 阿拉善右旗| 大冶市| 临海市| 甘孜| 阳朔县| 丽水市| 娱乐| 盘锦市| 红安县| 合阳县| 四子王旗| 黑水县| 沧源| 邛崃市| 晋城| 瑞安市| 宜章县| 高碑店市| 光山县| 清徐县| 龙井市| 鞍山市| 烟台市| 鹤峰县| 永仁县| 铁岭县|