遇到的问题

项目下个阶段需要前端进行加点乘除,提前开始准备整理方法函数,就遇到js浮点数计算的bug问题。

有时候计算的结果跟我们预期不一样,例如

0.1 + 0.2

//0.30000000000000004

1.4 - 0.3

//1.0999999999999999

19.9 * 100

//1989.9999999999998

24.56 / 100

//0.24559999999999998

原因也了解了,就不在这里多说,网上一大堆。

还有保留小数点时,使用toFixed方法会遇到四舍五入有差别,查原因说toFixed是遵守四舍六入五留双规则

2.235.toFixed(2)

//'2.23'

解决的办法

把x(浮点数)扩大10的n次方(n根据x的小数点位数决定)进行计算。在计算机语言中5e2表示 5 * 10的2次方,这种方式绝对不出现上面的例子3的情况

写了一个简单的对象修复浮点计算BUG,里面包含了加、减、乘、除、保留小数点、数字金额化方法

简单使用:

//加减法,如果需要减就加负数

numberFloat.addOrSub(0.1,0.2,0.4,-0.3) //结果0.4

//乘法

numberFloat.mul(19.9,100,2) //结果3980

//除法

numberFloat.div(19.9,100) //结果0.199

//保留小数

numberFloat.toFixed(2.235, 2) //结果2.24

//格式化

numberFloat.moneyFormat(15243.1456) //结果15,243.15

const numberFloat = {

getLength(x) {

let arr = x.toString().split('.')

return arr.length > 1 ? arr[1].length : 0

},

_handleData() {

let args = []

for (let i = 0; i < arguments.length; i++) {

args.push(arguments[i])

}

let r = args.map(x => {

return this.getLength(x)

})

const n = Math.max(...r)

//扩大之后的数据

//每一项扩大10的n次方

const c = args.map(x => {

return Number(`${x}e${n}`)

})

return { c, n }

},

//加减法, 减法就是加负数

addOrSub() {

const { c, n } = this._handleData(...arguments)

const reducer = (acc, curr) => acc + curr

let all = c.reduce(reducer, 0)

return all / Number(`1e${n}`)

},

mul() {

const { c, n } = this._handleData(...arguments)

const reducer = (acc, curr) => acc * curr

let all = c.reduce(reducer, 1)

return all / Number(`1e${n * arguments.length}`)

},

div() {

const { c } = this._handleData(...arguments)

const reducer = (acc, curr) => acc ? acc / curr : curr

let all = c.reduce(reducer)

return all

},

toFixed(count, n) {

let round = Math.round(`${count}e${n}`)

return Number(`${round}e${-n}`).toFixed(n)

},

moneyFormat(count) {

let mon = this.toFixed(count, 2)

let reg = /(\d)(?=(\d{3})+\.)/g

return mon.replace(reg, ($0, $1) => $1 + ',')

}

}

js 实现2的n次方计算函数_x的10的n次方解决js浮点数计算相关推荐

  1. 如何用计算机算10的-5次方,在excel中如何计算10的几次方呢

    excel的运算功能我们都知道非常强大,但是在excel中如何计算10的几次方呢?今天小编就通过一个简单的例子来给大家介绍下在excel中10的几次方的输入和运算方法. 第一.excel 10的几次方 ...

  2. PHP浮点数计算函数不四舍五入

    PHP浮点数计算函数不四舍五入 之前做统计模块时,遇到PHP计算精度的问题,比如: $a = 2586; $b = 2585.98;var_dump($a-$b); //期望的结果是:float(0. ...

  3. 求解10的75次方问题

    对于求一个数的高次方,最简单的方法,恐怕就是循环一定的次数,累乘.但是这样的效率太低.下面我提供一个高效的算法.来自左程云<程序员代码面试指南>. 就拿10的75次方举例: 1.75的二进 ...

  4. MPI实现求解10的八次方内素数的个数(版本一)

    使用MPI计算素数个数 算法实现所使用的方法: 当所要计算的个数达到10的8次方,甚至更多时,一台机器很难胜任这份工作. 使用MPI分布式并行计算可以实现这个目标,原来一个人干的事情现在让很多个人来干 ...

  5. php踩过的那些坑(5)浮点数计算

    一.前方有坑 php在使用加减乘除等运算符计算浮点数的时候,经常会出现意想不到的结果,特别是关于财务数据方面的计算,给不少工程师惹了很多的麻烦.比如今天工作终于到的一个案例: $a = 2586; $ ...

  6. 计算机怎么化成10的次方,10的n次方换算关系 10^N 计算机存储单位的换算关系

    10的18次方 |艾[可萨] | E 10的15次方 |拍[它] | P 10的12次方 |太[拉] | T 10的 9次方 |吉[咖] | G 10的 6次方 | 兆 | M 10的 3次方 | 千 ...

  7. js 实现2的n次方计算函数_密码杂凑函数的基本性质探讨

    密码学研究的宗旨是保证数据和通信的机密性.完整性和认证性,其中完整性和认证性的实现依赖于一类关键的密码学函数---密码杂凑函数.密码杂凑函数通常用来计算数据的短"指纹"(也称杂凑值 ...

  8. C语言exp()函数,计算以e为底的x次方的值

    exp()用来计算以e 为底的x 次方值,即ex 值,然后将结果返回.其原型为: double exp(double x);[返回值]返回 e 的x 次方计算结果. Description 写一函数求 ...

  9. python几次方函数_Python标准库math中用来计算x的y次方的函数是pow(x,y)。

    [判断题]Python表达式int("110", 2)的值为6. [单选题]关于 Python 的复数类型,以下选项中描述错误的是( ). [判断题]现代物流管理以实现顾客满意为第 ...

  10. 用html计算2的6次方,excel相乘函数!excel怎么输入10的几次方

    excel怎么输入10的几次方 http://zhidao.baidu.com/question/1495061608988293299.html excel如何插入幂次方 Shift 6 请问在EX ...

最新文章

  1. 教你如何用 Lua 操作文件中的数据
  2. mysql connector python linux_Python使用mysql.connector链接mysql数据库
  3. android 仿360浮动,Android--模仿360底部导航按钮
  4. 孙正义举债豪购ARM的3个理由:潜伏物联网时代
  5. 补充一点地理知识(以洲来划分各个国家(240个))
  6. java单例模式理解_快速理解Java中的五种单例模式
  7. 关于PHPExcel 导出下载表格,调试器响应乱码
  8. Python使用psutil模块,做你的电脑管家
  9. java spin lock_JAVA 各种锁机制
  10. mac iterm2 安装 lrzsz rz sz命令
  11. *Algs4-2.4.23Multiway的堆(未解决)
  12. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-5.HttpClient4.x工具获取使用...
  13. App 抓包-Fiddler简单使用教程
  14. Air系列模块常见问题列表
  15. C语言实现BMP格式转RGB格式、YUV格式
  16. 一周学习总结:vue学前准备知识
  17. 三十岁左右的你,现在收入多少?
  18. 阿里、美团、Oracle等大厂的Java虚拟机面试题集锦
  19. 增强现实(AR)、虚拟现实(VR)、混合现实(MR)之间有什么区别?
  20. java实现“进制转换-在线工具”

热门文章

  1. 使用laypage分页
  2. Symbian S60 自动通话录音
  3. 视频教程-人工智能-必备数学基础视频教程-机器学习
  4. MATLAB生成(对角线上元素相同的)三对角矩阵的实例
  5. [转]冰山一角 管窥中国互联网的地下世界
  6. 中国互联网二十四年红黑史
  7. 联发科/华为/三星等处理器规格表
  8. vue 个人头像修改
  9. 爱普生epson lq-630k打印机没有反应,发送成功,就是不打印
  10. HCIE面试真题战报及点评系列12