Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在不舍入的情况下求两个数的和_Javascript_Numbers - Fatal编程技术网

Javascript 如何在不舍入的情况下求两个数的和

Javascript 如何在不舍入的情况下求两个数的和,javascript,numbers,Javascript,Numbers,我有两个号码 a = 1548764548675465486; b = 4535154875433545787; 当我把这些数字相加时,它们被四舍五入 a => 1548764548675465500 b => 4535154875433545700 和a+b返回6083919424109011000,而它应该返回6083919424109011273 在不使用库的情况下,是否有javascript解决方案来解决此问题?javascript中没有整数,所有数字都是双精度浮点 这会

我有两个号码

a = 1548764548675465486;
b = 4535154875433545787;
当我把这些数字相加时,它们被四舍五入

a => 1548764548675465500
b => 4535154875433545700
a+b
返回
6083919424109011000
,而它应该返回
6083919424109011273


在不使用库的情况下,是否有javascript解决方案来解决此问题?

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

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

照此 和潜力,即使用图书馆

就我个人而言,我不会使用javascript,也不会擅长数字。只需在任何浏览器控制台窗口中键入0.1+0.2即可。结果是0.300000000004

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


关于浮点数细微差别的技术文章,如果您感兴趣,Javascript中没有整数,所有数字都是双精度浮点数

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

照此 和潜力,即使用图书馆

就我个人而言,我不会使用javascript,也不会擅长数字。只需在任何浏览器控制台窗口中键入0.1+0.2即可。结果是0.300000000004

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


关于浮点数细微差别的技术文章,如果您有兴趣解决与JavaScript数字相关的精度限制,您需要使用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"

演示:

要解决与JavaScript数字相关的精度限制,您需要使用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"

演示:

好吧,这是我发现的一个解决方案,不需要使用任何外部库,我只需要定义一个属性值为字符串的类,然后定义函数plus

    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)
        }
    }
var Number1 = new LongNumber("1548764548675465486");
var Number2 = new LongNumber("4535154875433545787");
var Result = Number1.plus(Number2);

Result.value // returns "6083919424109011273"

我发现了一个解决方案,不需要使用任何外部库,我只需要定义一个属性值为字符串的类,然后定义函数plus

    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)
        }
    }
var Number1 = new LongNumber("1548764548675465486");
var Number2 = new LongNumber("4535154875433545787");
var Result = Number1.plus(Number2);

Result.value // returns "6083919424109011273"

你需要一台64位机器……这是否意味着在web应用程序中,使用32位机器的用户无法获得准确的结果?不,不要听@Shahar的。JS数字是64位双精度浮点数字,与体系结构无关。如果不使用库,您必须自己实现BigInteger(任意精度算术)。@Shahar我正在创建一个支持长数字的计算器。这与求和无关。设置后查看
a
的值,您将看到
1548764548675465500
。这只是一个精度问题——IEEE双精度浮点(JavaScript数字通常使用的浮点)最多可以表示15-16位精度。如果你想获得更高的精度,你需要使用比JavaScript数字类型更复杂的东西。你需要一台64位机器……这是否意味着在web应用程序中,使用32位机器的用户不会得到准确的结果?不,不要听@Shahar的话。JS数字是64位双精度浮点数字,与体系结构无关。如果不使用库,您必须自己实现BigInteger(任意精度算术)。@Shahar我正在创建一个支持长数字的计算器。这与求和无关。设置后查看
a
的值,您将看到
1548764548675465500
。这只是一个精度问题——IEEE双精度浮点(JavaScript数字通常使用的浮点)最多可以表示15-16位精度。如果你想获得更好的精度,你需要使用比JavaScript数字类型更复杂的东西。你用
0.1+0.2
指出的浮点数对于任何使用它的语言都是正确的,不仅仅是javaScript…你用
0.1+0.2
指出的浮点数问题适用于任何使用它的语言,而不仅仅是javaScript。。。