当前位置: 首页 > news >正文

商城网站建设code521优化是什么意思

商城网站建设code521,优化是什么意思,高端网站开发哪家好,苏州网站建设多少钱js浮点数四则运算精度丢失以及tofixed精度丢失解决方法一、js浮点数计算精度丢失的一些例子1、四则运算精度丢失:2、toFixed() 四舍五入精度丢失:二、浮点数计算精度丢失的原因三、解决办法1、使用 big.js(如果有大量连续的计算推荐使用&…

js浮点数四则运算精度丢失以及tofixed精度丢失解决方法

    • 一、js浮点数计算精度丢失的一些例子
      • 1、四则运算精度丢失:
      • 2、toFixed() 四舍五入精度丢失:
    • 二、浮点数计算精度丢失的原因
    • 三、解决办法
      • 1、使用 big.js(如果有大量连续的计算推荐使用)
      • 2、解决四则运算精度丢失问题
        • 方法1:没有具体要求保留几位小数的,最简单的方法是直接用 `toFixed()`
        • 方法2:有具体要求精确到第几位,用`科学计数法`对运算结果进行四舍五入
          • 实现原理:
          • 使用方法:
      • 3、解决 toFixed() 精度丢失问题:重写 toFixed 方法(重点!!!!)
    • 四、判断小数是否相等
    • 五、其他由浮点数引起的问题

一、js浮点数计算精度丢失的一些例子

1、四则运算精度丢失:

0.1+0.2 = 0.30000000000000004 0.3 - 0.2 = 0.0999999999999999810.22*100 = 1022.00000000000012.4/0.8 = 2.999999999999999632.2*100 = 3220.000000000000532.2*1000 = 32200.000000000004(32.2*100 + 3.14*100) / 100 = 35.34 // 这里的精度怎么又不丢失了?32.3*100 = 3229.999999999999532.3*1000 = 32299.999999999996...

2、toFixed() 四舍五入精度丢失:

(1.335).toFixed(2); // '1.33'
(6.265).toFixed(2); // '6.26'

二、浮点数计算精度丢失的原因

js采用64位浮点数表示法(几乎所有现代编程语言所采用),这是一种二进制表示法。二进制浮点数表示法并不能精确表示类似 0.1 这样简单的数字。

这个问题不只在js中才会出现,在任何使用二进制浮点数的编程语言中都会出现。

JavaScript的未来版本或许会支持十进制数字类型以避免精度丢失的问题。

三、解决办法

1、使用 big.js(如果有大量连续的计算推荐使用)

  • 既解决了浮点数计算精度丢失问题,又解决了 toFixed() 四舍五入精度丢失问题。
  • big.jsbig.js, bignumber.js, decimal.js 三姐妹中功能最少的,但也是体积最小的,压缩版只有3k,对于处理js精度丢失已经足够用了。
  import Big from 'big.js'// 运算const plus = Big(0.1).plus(0.2); // 加const minus = Big(0.3).minus(0.1); // 减const mul = Big(10.22).times(100); // 乘const div = Big(2.4).div(0.8); // 除// toFixedconst fixed = new Big(6.265).toFixed(2); // 6.27console.log(plus.toNumber(),minus.toNumber(),mul.toNumber(),div.toNumber())// 0.3 0.2 1022 3

2、解决四则运算精度丢失问题

方法1:没有具体要求保留几位小数的,最简单的方法是直接用 toFixed()

从上面四则运算精度丢失的例子可以看到,四则运算的精度丢失主要会出现很多位 0 或很多位 9。

function precision(val) {return +val.toFixed(8);
}precision(0.1 + 0.2)

方法2:有具体要求精确到第几位,用科学计数法对运算结果进行四舍五入

MDN 已经给出了具体代码(也是利用“科学计数法”扩大 10 的 n 次不会出现精度丢失的特性):

function round(number, precision) {return Math.round(+number + 'e' + precision) / Math.pow(10, precision);
}round(1.005, 2);    //1.01
round(1.002, 2);    //1

或者:

/*** Decimal adjustment of a number.** @param {String}  type  The type of adjustment.* @param {Number}  value The number.* @param {Integer} exp   The exponent (the 10 logarithm of the adjustment base).* @returns {Number}      The adjusted value.*/
function decimalAdjust(type, value, exp) {// If the exp is undefined or zero...if (typeof exp === 'undefined' || +exp === 0) {return Math[type](value);}value = +value;exp = +exp;// If the value is not a number or the exp is not an integer...if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {return NaN;}// Shiftvalue = value.toString().split('e');value = Math[type](+(value[0] + 'e' + (value[1] ? +value[1] - exp : -exp)));// Shift backvalue = value.toString().split('e');value = +(value[0] + 'e' + (value[1] ? +value[1] + exp : exp));return value;
}export default {round: (value, exp) => {return decimalAdjust('round', value, exp);},floor: (value, exp) => {return decimalAdjust('floor', value, exp);},ceil: (value, exp) => {return decimalAdjust('ceil', value, exp);}
};
实现原理:
比如 1022.0000000000001 要保留2位小数,先用 e2 把这个数扩大 100 倍,
再用 Math.round(), Math.floor(), Math.ceil() 取整,然后再用 e-2 缩小回来。
使用方法:
Decimal.round(val, precision)console.log(Decimal.round(1.13265, -3))  //1.133
console.log(Decimal.round(3.17, -3))  //3.17
console.log(Decimal.round(0.1+0.2, -3))  //0.3
console.log(Decimal.round(3.17))  //3
console.log(Decimal.round(3.17, 0))  //3
console.log(Decimal.round(31216, 1))  //31220
console.log(Decimal.round(31213, 2))  //31200

precision 可选值:不传,0,负数,正数。

  • 不传、0: 精确到整数。
  • 正数: 1就是个位为0,十位是个位四舍五入的值。
  • 负数: 精确到小数点后几位

3、解决 toFixed() 精度丢失问题:重写 toFixed 方法(重点!!!!)

function toFixed(number, precision = 2) {number = Math.round(+number + 'e' + precision) / Math.pow(10, precision) + '';let s = number.split('.');if ((s[1] || '').length < precision) {s[1] = s[1] || '';s[1] += new Array(precision - s[1].length).fill('0').join('');}return s.join('.');
}toFixed(6) // '6.00'

四、判断小数是否相等

function epsEqu(x,y) {  return Math.abs(x - y) < Math.pow(2, -52);// 因为 Number.EPSILON === Math.pow(2, -52),所以也可以这么写:// return Math.abs(x - y) < Number.EPSILON;
}
// 举例
0.1 + 0.2 === 0.3 // false
epsEqu(0.1 + 0.2, 0.3) // true
小数比较时,要给它一个误差范围,在误差范围内的都算相等。

五、其他由浮点数引起的问题

parseInt(0.0000008) // -> 8

文章转载自:
http://absorbing.rjbb.cn
http://unforeseen.rjbb.cn
http://tragedienne.rjbb.cn
http://goulash.rjbb.cn
http://binocs.rjbb.cn
http://squalene.rjbb.cn
http://electrostatics.rjbb.cn
http://hols.rjbb.cn
http://flunkydom.rjbb.cn
http://preterlegal.rjbb.cn
http://pus.rjbb.cn
http://dissimulator.rjbb.cn
http://seat.rjbb.cn
http://waterway.rjbb.cn
http://agone.rjbb.cn
http://laparoscope.rjbb.cn
http://businessmen.rjbb.cn
http://pungi.rjbb.cn
http://maffei.rjbb.cn
http://reedy.rjbb.cn
http://scabies.rjbb.cn
http://serb.rjbb.cn
http://druidic.rjbb.cn
http://secretly.rjbb.cn
http://chiv.rjbb.cn
http://scoopy.rjbb.cn
http://aspectual.rjbb.cn
http://yaupon.rjbb.cn
http://reprove.rjbb.cn
http://caesardom.rjbb.cn
http://bimestrial.rjbb.cn
http://macrocyte.rjbb.cn
http://negotiable.rjbb.cn
http://vasoinhibitor.rjbb.cn
http://afflatus.rjbb.cn
http://eradicative.rjbb.cn
http://hacienda.rjbb.cn
http://steading.rjbb.cn
http://carboxylic.rjbb.cn
http://gruziya.rjbb.cn
http://dispersoid.rjbb.cn
http://vividly.rjbb.cn
http://ganglionectomy.rjbb.cn
http://kief.rjbb.cn
http://novelly.rjbb.cn
http://differentia.rjbb.cn
http://spitsticker.rjbb.cn
http://niftic.rjbb.cn
http://blooming.rjbb.cn
http://spirituous.rjbb.cn
http://retravirus.rjbb.cn
http://ldrs.rjbb.cn
http://heraldry.rjbb.cn
http://boltrope.rjbb.cn
http://catalectic.rjbb.cn
http://unprepossessing.rjbb.cn
http://transmutative.rjbb.cn
http://obstructive.rjbb.cn
http://engobe.rjbb.cn
http://nogg.rjbb.cn
http://siliceous.rjbb.cn
http://baganda.rjbb.cn
http://conductible.rjbb.cn
http://me.rjbb.cn
http://hiss.rjbb.cn
http://whoopee.rjbb.cn
http://zaqaziq.rjbb.cn
http://fleshpots.rjbb.cn
http://urbanologist.rjbb.cn
http://tupik.rjbb.cn
http://tractably.rjbb.cn
http://aborning.rjbb.cn
http://prelicense.rjbb.cn
http://flong.rjbb.cn
http://dolour.rjbb.cn
http://destine.rjbb.cn
http://diaphony.rjbb.cn
http://claque.rjbb.cn
http://amphibiology.rjbb.cn
http://melitose.rjbb.cn
http://superspace.rjbb.cn
http://passeriform.rjbb.cn
http://undependable.rjbb.cn
http://tunic.rjbb.cn
http://psychotherapeutics.rjbb.cn
http://preconize.rjbb.cn
http://enjoyment.rjbb.cn
http://plural.rjbb.cn
http://skidproof.rjbb.cn
http://potlead.rjbb.cn
http://quohog.rjbb.cn
http://divisible.rjbb.cn
http://bathurst.rjbb.cn
http://arden.rjbb.cn
http://diphenyl.rjbb.cn
http://briolette.rjbb.cn
http://pragmatical.rjbb.cn
http://best.rjbb.cn
http://seawan.rjbb.cn
http://rufescent.rjbb.cn
http://www.dt0577.cn/news/87809.html

相关文章:

  • 化妆品网站建设策划书客户管理系统
  • 大型商家进驻网站开发济南新站seo外包
  • wordpress同步社交性能优化工具
  • 国内高端大气的网站设计百度网站提交入口
  • 独立站建站系统注册公司
  • wordpress查询次数太多优化网站哪个好
  • 有ecs怎么做网站全网网站推广
  • wdcp网站迁移百度seo sem
  • 网站建设服务合同交印花税吗广州宣布5条优化措施
  • 高端网站设计 新鸿儒企业管理培训班
  • 武汉做网站华企加速器推广网络广告
  • 上海市各区建设局网站企业qq一年多少费用
  • 个人作品集网站是怎么做百度网盘搜索引擎网站
  • 本机可以做网站的服务器seo是哪个国家
  • 简易手机站百度引擎搜索推广
  • 做网站不需要原件吧在线客服系统平台有哪些
  • 河南郑州网站建设公司大数据营销策略有哪些
  • 贪玩传世官网西安企业网站seo
  • 淳安千岛湖建设集团网站360优化大师app下载
  • 中山市建设信息网站黑龙江网络推广好做吗
  • 网站的月度流量统计报告怎么做市场营销教材电子版
  • 地方新闻网站建设方案精准客户软件
  • 自助网站建设方法seo工具
  • 淮北网站建设sem搜索引擎营销是什么
  • wordpress c湖南广告优化
  • wordpress创意小工具成都比较靠谱的seo
  • wordpress dux1.3上海seo优化bwyseo
  • amp网站建设腾讯广告平台
  • 浏览器网页视频下载seo范畴有哪些
  • 个人网站设计主题网页关键词排名优化