我有2个号码
a = 1548764548675465486;
b = 4535154875433545787;
当我将这些数字相加时,它们将四舍五入为
a => 1548764548675465500
b => 4535154875433545700
和a + b
返回6083919424109011000
,同时返回6083919424109011273
是否有一个javascript解决方案来解决这个问题没有使用库?
答案 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"
答案 1 :(得分:1)
Javascript中没有整数,所有数字都是双精度浮点数。
这会给你一个大约15-16位的精度,这就是你所看到的。
就个人而言,我不会使用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"