如何将2个数字相加而不进行舍入

时间:2014-07-31 02:01:23

标签: javascript numbers

我有2个号码

a = 1548764548675465486;
b = 4535154875433545787;

当我将这些数字相加时,它们将四舍五入为

a => 1548764548675465500
b => 4535154875433545700

a + b返回6083919424109011000,同时返回6083919424109011273

是否有一个javascript解决方案来解决这个问题没有使用库?

3 个答案:

答案 0 :(得分:3)

要解决与JavaScript数字相关的精度限制,您需要使用BigInteger库,例如此处提供的热门库:http://silentmatt.com/biginteger/

用法:

var a = BigInteger("1548764548675465486");
var b = BigInteger("4535154875433545787");
var c = a.add(b);

alert(a.toString() + ' + ' + b.toString() + ' = ' + c.toString());
// Alerts "1548764548675465486 + 4535154875433545787 = 6083919424109011273"

演示:http://jsfiddle.net/69AEg/1/

答案 1 :(得分:1)

Javascript中没有整数,所有数字都是双精度浮点数。

这会给你一个大约15-16位的精度,这就是你所看到的。

按此question 和潜在的solution即使用图书馆

就个人而言,我不会使用javascript,从未在数字上表现出色。只需尝试在任何浏览器控制台窗口中键入0.1 + 0.2。结果是0.30000000000000004。

将计算结果发送到服务器端语言(作为字符串)并在那里完成工作,您应该有更好的结果。

关于浮点数here细微差别的技术文章,如果您有兴趣

答案 2 :(得分:0)

嗯,这是我发现没有使用任何外部库的解决方案,我需要做的就是定义一个具有属性值的类,该类应该是一个字符串,并定义功能加

    function LongNumber()
    {
        // it takes the argument and remove first zeros
        this.value = arguments[0].toString();
        while(this.value[0]==="0")
            this.value = this.value.substr(1);

        // this function adds the numbers as string to another string and returns result as LongNumber
        this.plus = function (Num)
        {
            var num1 = pad(Num.value.length, this.value);
            var num2 = pad(this.value.length, Num.value);
            var numIndex = num1.length;
            var rest = 0;
            var resultString = "";
            while (numIndex)
            {
                var number1 = parseInt(num1[(numIndex)-1]);
                var number2 = parseInt(num2[(numIndex--)-1]);
                var addition = (number1+number2+rest)%10;
                rest = parseInt((number1+number2+rest)/10);
                resultString = addition.toString() + resultString;
            }
            return new LongNumber((rest?rest.toString():"") + resultString);
        }
        function pad(width, string) 
        { 
            return (width <= string.length) ? string : pad(width, '0' + string)
        }
    }

我现在需要做的就是声明2个LongNombers并使用函数加号

var Number1 = new LongNumber("1548764548675465486");
var Number2 = new LongNumber("4535154875433545787");
var Result = Number1.plus(Number2);

Result.value // returns "6083919424109011273"