计算机存储数字为二进制,所以对于小数的转换会有无限循环的问题,当达到最大位数时就会有类似四舍五入的效果,但是二进制只有0和1,也就变成了0舍1入。
0.1 ====> 0.0001 1001 1001 1001…(1001无限循环)
解决方法
将小数转换为整数
function add(a, ...b) {
// 获取小数位数
let aLength = a.toString().split('.')[1]
? a.toString().split('.')[1].length
: 0
let bLength = []
for (let i = 0; i < b.length; i++) {
bLength[i] = b[i].toString().split('.')[1]
? b[i].toString().split('.')[1].length
: 0
}
// 保证所有浮点数都能转变为整数的最小10倍数
let m = Math.pow(10, Math.max(aLength, ...bLength))
let count = 0
// 加法运算
for (let i = 0; i < bLength.length; i++) {
count =
count + (Math.floor(b[i] * m + 0.5) ? Math.floor(b[i] * m + 0.5) : 0)
}
count = count + (Math.floor(a * m + 0.5) ? Math.floor(a * m + 0.5) : 0)
// 还原增加的倍数
return count / m
}
function reduce(a, ...b) {
// 获取小数位数
let aLength = a.toString().split('.')[1]
? a.toString().split('.')[1].length
: 0
let bLength = []
for (let i = 0; i < b.length; i++) {
bLength[i] = b[i].toString().split('.')[1]
? b[i].toString().split('.')[1].length
: 0
}
// 保证所有浮点数都能转变为整数的最小10倍数
let m = Math.pow(10, Math.max(aLength, ...bLength))
let count = 0
// 减法运算
for (let i = 0; i < bLength.length; i++) {
console.log(count)
count = count + (Math.floor(b[i] * m + 0.5) ? Math.floor(b[i] * m + 0.5) : 0)
}
count = (Math.floor(a * m + 0.5) ? Math.floor(a * m + 0.5) : 0) - count
// 还原增加的倍数
return count / m
}
function ride(a, ...b) {
// 获取小数位数
let aLength = a.toString().split('.')[1]
? a.toString().split('.')[1].length
: 0
// 两个以上数据相乘
let bLength = []
for (let i = 0; i < b.length; i++) {
bLength[i] = b[i].toString().split('.')[1]
? b[i].toString().split('.')[1].length
: 0
}
// 保证所有浮点数都能转变为整数的最小10倍数
let m = Math.pow(10, Math.max(aLength, ...bLength))
let count = 1
// 乘法运算
for (let i = 0; i < bLength.length; i++) {
count = count * (Math.floor(b[i] * m + 0.5) ? Math.floor(b[i] * m + 0.5) : 1)
}
count = count * (Math.floor(a * m + 0.5) ? Math.floor(a * m + 0.5) : 1)
// 还原增加的倍数
return count / Math.pow(m, bLength.length + 1)
}
function except(a, ...b) {
// 获取小数位数
let aLength = a.toString().split('.')[1]
? a.toString().split('.')[1].length
: 0
// 两个以上数据相除
let bLength = []
for (let i = 0; i < b.length; i++) {
bLength[i] = b[i].toString().split('.')[1]
? b[i].toString().split('.')[1].length
: 0
}
// 保证所有浮点数都能转变为整数的最小10倍数
let m = Math.pow(10, Math.max(aLength, ...bLength))
let count = 1
// 除数乘法运算
for (let i = 0; i < bLength.length; i++) {
count = count * (Math.floor(b[i] * m + 0.5) ? Math.floor(b[i] * m + 0.5) : 1)
}
// 整体除法运算,需要先还原乘法增加的倍数与被除数保持一致
count = (Math.floor(a * m + 0.5) ? Math.floor(a * m + 0.5) : 0) / (count / Math.pow(m, bLength.length - 1))
return count
}