在前端开发中,进行精确的加减乘除运算通常是因为JavaScript的浮点数运算存在精度问题。为了解决这个问题,可以使用一些库,如decimal.js
或big.js
,或者手动实现这些方法。
以下是一个简单的示例,使用JavaScript手动封装精确的加减乘除四个方法:
/**
* 精确加法
* @param {number} num1 第一个数
* @param {number} num2 第二个数
* @return {string} 返回精确计算后的结果(字符串格式)
*/
function preciseAdd(num1, num2) {
const r1 = num1.toString().split(".")[1] ? num1.toString().split(".")[1].length : 0;
const r2 = num2.toString().split(".")[1] ? num2.toString().split(".")[1].length : 0;
const m = Math.pow(10, Math.max(r1, r2));
return ((num1 * m + num2 * m) / m).toFixed(Math.max(r1, r2));
}
/**
* 精确减法
* @param {number} num1 第一个数
* @param {number} num2 第二个数
* @return {string} 返回精确计算后的结果(字符串格式)
*/
function preciseSubtract(num1, num2) {
const r1 = num1.toString().split(".")[1] ? num1.toString().split(".")[1].length : 0;
const r2 = num2.toString().split(".")[1] ? num2.toString().split(".")[1].length : 0;
const m = Math.pow(10, Math.max(r1, r2));
// 保证 num2 不会比 num1 大,从而避免得到负数结果时出现问题
const n = (r1 >= r2) ? r1 : r2;
return ((num1 * m - num2 * m) / m).toFixed(n);
}
/**
* 精确乘法
* @param {number} num1 第一个数
* @param {number} num2 第二个数
* @return {string} 返回精确计算后的结果(字符串格式)
*/
function preciseMultiply(num1, num2) {
const m = num1.toString().split(".")[1] ? num1.toString().split(".")[1].length : 0;
const n = num2.toString().split(".")[1] ? num2.toString().split(".")[1].length : 0;
return (Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", "")) / Math.pow(10, m + n)).toFixed(m + n);
}
/**
* 精确除法
* @param {number} num1 第一个数
* @param {number} num2 第二个数
* @return {string} 返回精确计算后的结果(字符串格式)
*/
function preciseDivide(num1, num2) {
const t1 = num1.toString().split(".")[1] ? num1.toString().split(".")[1].length : 0;
const t2 = num2.toString().split(".")[1] ? num2.toString().split(".")[1].length : 0;
const r1 = Number(num1.toString().replace(".", ""));
const r2 = Number(num2.toString().replace(".", ""));
return (r1 / r2 * Math.pow(10, t2 - t1)).toFixed(Math.max(0, t1 - t2));
}
注意:这些方法返回的是字符串格式的结果,以确保精度。如果你需要数字格式的结果,可以使用parseFloat()
或Number()
进行转换,但请注意这可能会引入一些微小的精度损失。
另外,这些方法没有处理可能的异常情况,如除数为0等。在实际应用中,你可能需要添加更多的错误处理和边界检查。
标签:封装,num1,num2,r1,toString,split,const,加减乘除,运算 From: https://www.cnblogs.com/ai888/p/18674174