js 大数字科学计数法实现,计算精度问题如何优化?

代码:

    const n = value * Math.pow(10, -p)
    console.log(n, `=====n = ${value} * (pow(10, ${-p}) = ${Math.pow(10, -p)})`)

打印:

0.9999999999999999 '=====n = 100000000000 * (pow(10, -11) = 1e-11)'

image.png

100000000000 * 1e-11 得出了一个 0.9999999999999999

更大的数反而可以
image.png

包括这样的计算:
image.png
image.png

求解,我想做的是数字转科学记数法,有没有其他办法,难道只能使用字符串处理了吗?

阅读 2.6k
4 个回答

可以考虑用依赖的话,考虑一下 Big.js ?

倒也不用自己写高精计算,可以使用 Decimal.js ,或者等待 proposal-decimal

计算机中的浮点数是按IEEE754标准来的, 不能精确的表示成十进制数.

只能给科学计算法加个精度, 或者找个 BigDecimal 库, 用字符串计算.

可以考虑使用字符串进行计算:

// 计算相乘
var multiply = function (num1, num2) {
    if (num1 === '0' || num2 === '0') return '0'
    let len1 = num1.length, len2 = num2.length, res = new Array(len1 + len2).fill(0)
    // 结果最多为 m + n 位数
    for (let i = len1 - 1; i >= 0; i--) {
        for (let j = len2 - 1; j >= 0; j--) {
            // 从个位数开始,逐步相乘
            const mul = num1[i] * num2[j]
            // 乘积在结果数组中对应的位置
            const p1 = i + j, p2 = i + j + 1
            // 对结果进行累加
            const sum = mul + res[p2]
            res[p1] += Math.floor(sum / 10)
            res[p2] = sum % 10
        }
    }
    if (res[0] === 0) res.shift()
    return res.join("")
};


作者:不吃辣
链接:https://leetcode.cn/problems/multiply-strings/solutions/1632274/dai-ma-jian-ji-de-jie-fa-jsban-ben-by-it-zpqu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题