如何把两个数字加起来而不四舍五入

How to sum 2 numbers witout rounding

本文关键字:数字 起来 四舍五入 两个      更新时间:2023-09-26

我有两个数字

a = 1548764548675465486;
b = 4535154875433545787;

当我把这些数字加起来时,它们四舍五入到

a => 1548764548675465500
b => 4535154875433545700

a + b返回6083919424109011000而应该返回6083919424109011273

有没有不使用库的javascript解决方案来解决这个问题?

要解决与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/

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

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

根据这个问题潜在的解决方案是使用库

就我个人而言,我不会使用javascript,从来都不擅长数字。只要尝试在任何浏览器控制台窗口中输入0.1 + 0.2即可。结果为0.30000000000000004。

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

关于浮点数的细微差别的技术文章,如果你感兴趣的话

好吧,这是一个解决方案,我发现没有使用任何外部库,我所需要做的就是定义一个类,它的属性值应该是一个字符串,并定义函数加

    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个longnumbers并使用函数plus

var Number1 = new LongNumber("1548764548675465486");
var Number2 = new LongNumber("4535154875433545787");
var Result = Number1.plus(Number2);
Result.value // returns "6083919424109011273"