分别封装精确运算的加减乘除四个方法

在前端开发中,进行精确的加减乘除运算通常是因为JavaScript的浮点数运算存在精度问题。为了解决这个问题,可以使用一些库,如decimal.jsbig.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等。在实际应用中,你可能需要添加更多的错误处理和边界检查。

posted @ 2025-01-16 09:10  王铁柱6  阅读(71)  评论(0)    收藏  举报