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

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-29 20:09   27   0

遇到的问题

项目下个阶段需要前端进行加点乘除,提前开始准备整理方法函数,就遇到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 + ',')

}

}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP