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。。。