因为的浮点计算有问题例如(0.1+0.2=0.30000000000000004)

一、js浮点运算加减乘除

解决办法:使用Math.js或者currency.js  JS插件

如果不想引入插件只想使用一个工具方法,部分地方使用

放在util.js里面

 export var floatObj = (function () {/** 判断obj是否为一个整数*/function isInteger (obj) {return Math.floor(obj) === obj}/** 将一个浮点数转成整数,返回整数和倍数。如 3.14 >> 314,倍数是 100* @param floatNum {number} 小数* @return {object}*   {times:100, num: 314}*/function toInteger (floatNum) {var ret = { times: 1, num: 0 }if (isInteger(floatNum)) {ret.num = floatNumreturn ret}var strfi = floatNum + ''var dotPos = strfi.indexOf('.')var len = strfi.substr(dotPos + 1).lengthvar times = Math.pow(10, len)var intNum = Number(floatNum.toString().replace('.', ''))ret.times = timesret.num = intNumreturn ret}/** 核心方法,实现加减乘除运算,确保不丢失精度* 思路:把小数放大为整数(乘),进行算术运算,再缩小为小数(除)** @param a {number} 运算数1* @param b {number} 运算数2* @param digits {number} 精度,保留的小数点数,比如 2, 即保留为两位小数* @param op {string} 运算类型,有加减乘除(add/subtract/multiply/divide)**/function operation (a, b, digits, op) {var o1 = toInteger(a)var o2 = toInteger(b)var n1 = o1.numvar n2 = o2.numvar t1 = o1.timesvar t2 = o2.timesvar max = t1 > t2 ? t1 : t2var result = nullswitch (op) {case 'add':if (t1 === t2) { // 两个小数位数相同result = n1 + n2} else if (t1 > t2) { // o1 小数位 大于 o2result = n1 + n2 * (t1 / t2)} else { // o1 小数位 小于 o2result = n1 * (t2 / t1) + n2}return result / maxcase 'subtract':if (t1 === t2) {result = n1 - n2} else if (t1 > t2) {result = n1 - n2 * (t1 / t2)} else {result = n1 * (t2 / t1) - n2}return result / maxcase 'multiply':result = (n1 * n2) / (t1 * t2)return resultcase 'divide':result = (n1 / n2) * (t2 / t1)return result}}// 加减乘除的四个接口function add (a, b, digits) {return operation(a, b, digits, 'add')}function subtract (a, b, digits) {return operation(a, b, digits, 'subtract')}function multiply (a, b, digits) {return operation(a, b, digits, 'multiply')}function divide (a, b, digits) {return operation(a, b, digits, 'divide')}// exportsreturn {add: add,subtract: subtract,multiply: multiply,divide: divide}
}())

使用方法:

*  add / subtract / multiply /divide 加、减、乘、除

* floatObj.add(0.1, 0.2) >> 0.3

* floatObj.multiply(19.9, 100) >> 1990

二、四舍五入

四舍五入(保留两位小数)

首先

Math.round(num * 100) / 100

这种存在一个问题、就是四舍五入其实是(四舍六入五成双)就是最后一位(第三位)是根据第二位是5的时候还要判断是否奇数偶数来进行入的

解决办法:

export function realSAmoutRound (number) {const i = 2let finNum = nulllet num = Number(number)if (!isNaN(num)) {const arr = num.toString().split('.')if (arr.length > 1 && arr[1].length > i) {const decimal = arr[1].slice(i, i + 1)if (decimal === '5') {num += Math.pow(0.1, i + 1)}finNum = num.toFixed(i)} else {finNum = num}finNum = Number(finNum )}return finNum
}

测试:

js浮点运算、以及四舍五入相关推荐

  1. [js] 如何避免JS浮点运算的精度问题(例:0.1+0.7=0.7999999999999999)

    [js] 如何避免JS浮点运算的精度问题(例:0.1+0.7=0.7999999999999999) function precision(num1,num2){num1Length = num1.t ...

  2. JS 进一法 四舍五入

    做需求的时候有时候需要逢小数进一,有时候需要舍去小数,方法如下: 括号里放入数字就可以,微信小程序也可以用. //仅取整数部分 Math.floor()//小数进一 Math.ceil()//四舍五入 ...

  3. [js]取整,四舍五入,数字字符串转换

    取整: 向下取整Math.floor(),向上取整Math.ceil(),四舍五入Math.round()),保留有效数位n.toFixed(),产生大于等于0小于1的随机数Math.random() ...

  4. js中的四舍五入,取整

    主题: 主要记录一下js中的一些Math函数 Detail: 1. 四舍五入: Math.round(1.23); // 1 2. 只取整数: Math.parseInt(1.23); // 1 3. ...

  5. js如何实现四舍五入 Math.round()

    所谓的四舍五入,其实就是取与该值最接近的整数罢了 很多人都会对Math.round()来处理负数的情况下产生疑问,其实它的用法和正数是一样的,需要注意的是小数部分为0.5的时候,无论正负数他都会向上取 ...

  6. js的toFixed四舍五入偶尔不正确的问题

    原因:因为toFixed是一个四舍六入五成双的方法 四舍六入好理解,那什么叫五成双呢 "五"指的是根据5后面的数字来定,当5后有数时,舍5入1:当5后无有效数字时,需要分两种情况来 ...

  7. js的数字四舍五入方法

    /*** @description 计算小数点后面几位的四舍五入处理* @param {*} num * @param {*} digit * @returns */ export const mat ...

  8. js中toFixed四舍五入精度问题

    1 .tofixed方法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字.例如将数据Num保留2位小数,则表示为:toFixed(Num):但是其四舍五入的规则与数学中的规则 ...

  9. js金额价格四舍五入保留2位小数demo效果(整理)

    四舍五入保留2位小数(不够位数,则用0替补) function keepTwoDecimalFull(num) {var result = parseFloat(num);if (isNaN(resu ...

最新文章

  1. 可以左右移动多选下拉列表的javaScipt(可以兼容IE和firefox)
  2. 服务器标记“asp:ScriptManager”不明确。
  3. 关于HTML Object中三个Style实例的区别
  4. 【渝粤题库】陕西师范大学229011 商业银行信贷管理Ⅰ 作业(高起专)
  5. Windows Phone 7, Hammock, OAuth and Sina Weibo’s API
  6. 锐捷自动定时启动,开机自动认证校园网 教程
  7. 网易云课堂 oracle,网易云课堂DBA学习笔记 (一) 数据库基础
  8. Python 文本处理的几个库
  9. 计算机存储数据时2的20次方,2的20次方是多少
  10. 计算机历史记录无法删除,win10时间线灰色浏览记录删不掉怎么回事_win10时间线历史灰色无法删除的解决教程-win7之家...
  11. tyvj 2053 [Nescafé29]穿越七色虹
  12. 【渝粤教育】广东开放大学 古代汉语 形成性考核 (28)
  13. 咖啡屋时光书城【原创】
  14. 读《我能记住 - 读写记忆困难儿童实战》
  15. Python strip()方法
  16. JavaScript-动画-轮播图
  17. 根据byte数组,生成文件
  18. 关于 ‘else‘ without a previous ‘if‘错误
  19. 网页设计 1.HTML
  20. Frontiers in Neuroscience:fMRI研究指南

热门文章

  1. 谷歌浏览器开启摄像头功能
  2. Hexo博客:部署与插件
  3. 【软件测试】python+selenium自动化测试
  4. 装鸿蒙系统发布,华为正式发布鸿蒙系统 鸿蒙系统怎么样如何操作安装?
  5. python查询数据库数据并将数据写入csv文件,并读取
  6. keepalived.conf配置手册译文
  7. css背景颜色透明,字体不透明
  8. 在没有配置的 DNS 服务器响应之后,名称xxxxxxxx的名称解析超时 解决方法
  9. 递归——斐波那契数列
  10. 中国电信网优测试软件,退CDMA时机已成熟,网友亲身测试验证中国电信网优真实原因!...