javascript - JS中123456789*987654321运行结果不对
迷茫
迷茫 2017-04-11 09:09:33
[JavaScript讨论组]

源于leetCode上的这道题
给出两个字符串形式的整数, 返回这两个整数的积

Input:
"123456789"
"987654321"
Output:
"121932631112635260"
Expected:
"121932631112635269"

在console里算了下, 的确不对

最后一位明明应该是9的嘛.

可能是什么原因造成的呢? 看了下结果的长度是18位, 貌似没有超出表示范围啊?
这种情况又有何解决方案呢?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(6)
ringa_lee

JavaScript 最大的数 Number.MAX_SAFE_INTEGER

大家讲道理

很明显这种题是大数运算,题目的提示也说了:

Converting the input string to integer is NOT allowed.
不允许将输入字符串直接转换为数字。

给你写个简单的大数乘法:

var multiply = function(x, y) {
    if(x === "0" || y === "0") {
        return("0");
    }
    const ans = [],
        num1 = x.split("").map((n) => parseInt(n)).reverse(),
        num2 = y.split("").map((n) => parseInt(n)).reverse();

    for(let i = 0; i < num1.length; i++) {
        for(let j = 0; j < num2.length; j++) {
            if(ans[i + j] === undefined) {
                ans[i + j] = 0;
            }
            ans[i + j] += num1[i] * num2[j];
            if(ans[i + j] > 9) {
                if(ans[i + j + 1] === undefined) {
                    ans[i + j + 1] = 0;
                }
                ans[i + j + 1] += parseInt(ans[i + j] / 10);
                ans[i + j] %= 10;
            }
        }
    }

    return(ans.reverse().join(""));
};
怪我咯

大数运算,好像leetcode上还有一道题是大数加法的:

function multiply(num1, num2) {
    let m = num1.length,
        n = num2.length;
    let pos = Array.from({length: m + n}).fill(0);
    for (let i = m - 1; i >= 0; i--) {
        for (let j = n - 1; j >= 0; j--) {
            let mul = num1[i] * num2[j];
            let p1 = i + j,
                p2 = i + j + 1,
                sum = mul + pos[p2];
            pos[p1] += sum / 10 >>> 0;
            pos[p2] = sum % 10;
        }
    }
    return pos.join('');
}

console.log(multiply("123456789", "987654321"))
巴扎黑

JavaScript没有整数,只有Number,Number其实是浮点数。Number有一个MAX_SAFE_INTEGER,超出这个范围的数有可能会出现问题。
我在Chrome的console中测试了一下:

var a = 9007199254740993
console.log(a) // 输出:9007199254740992
PHP中文网

浮点数范围:

as  large  as ±1.7976931348623157 × 10的308次方
as small as ±5 × 10的−324次方

精确整数范围:

The JavaScript number format allows you to exactly represent all integers between
−9007199254740992  and 9007199254740992 (即正负2的53次方)

数组索引还有位操作:

正负2的31次方

你的运算超出了精确范围!

伊谢尔伦

Big Integer for JavaScript

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号