let a = 2;
let b = 1.99999999;
a - b = 9.99999993922529e-9
这里二者相减,得到了一个被自动转换成了科学计数法的数字。
请问有没有办法关闭这种自动转换?
计算精度缺失了,一个无限接近0的数,你想咋显示?2-1.999999 = 0 吗,那直接取整就行了。
试试https://blog.csdn.net/sinat_36422236/article/details/84591296 和https://blog.csdn.net/weixin_33725272/article/details/91749539?utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.base
可以把科学计数法转换为字符串
/**
* @description 科学计数法转为string
* @param {string, number} param
*/
function scientificNotationToString(param) {
let strParam = String(param)
let flag = /e/.test(strParam)
if (!flag) return param
// 指数符号 true: 正,false: 负
let sysbol = true
if (/e-/.test(strParam)) {
sysbol = false
}
// 指数
let index = Number(strParam.match(/\d+$/)[0])
// 基数
let basis = strParam.match(/^[\d\.]+/)[0].replace(/\./, '')
if (sysbol) {
return basis.padEnd(index + 1, 0)
} else {
return basis.padStart(index + basis.length, 0).replace(/^0/, '0.')
}
}
scientificNotationToString(a-b)调用就行了,结果0.00000000999999993922529
因为有误差,想消除误差可以用下边的方法运算
function mul(a, b) {
var c = 0,
d = a.toString(),
e = b.toString();
try {
c += d.split(".")[1].length;
} catch (f) {}
try {
c += e.split(".")[1].length;
} catch (f) {}
return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
}
function sub(a,b){
var c, d, e;
try {
c = a.toString().split(".")[1].length;
} catch (f) {
c = 0;
}
try {
d = b.toString().split(".")[1].length;
} catch (f) {
d = 0;
}
return e = Math.pow(10, Math.max(c, d)), (mul(a, e) - mul(b, e)) / e;
}
mul(a,b)返回a,b相乘,sub(a,b)返回a,b相减
关闭是关闭不了的,但是你可以不用js的计算方法,我用的是numeral.js这个库的计算方式,不会出现这种问题
该库包含加减乘除的方法的。https://github.com/adamwdraper/Numeral-js