我在javascript中看到了一个最奇怪的事情。 服务器端(弹簧):
@RequestMapping(value = "/foo", method = RequestMethod.GET)
@ResponseBody
public Long foo() {
return 793548328091516928L;
}
我返回一个long值并且:
$.get('/foo').done(function(data){
console.log(data);
});
它表示长整数为“793548328091516900”,用0替换(确实舍入)最后两位数字。当我从任何浏览器的地址栏发出GET请求时,数字表示正确;因此,在我看来,这是一个js问题。
从服务器返回一个字符串而不是long,并使用:
进行处理var x = new Number(data).toFixed();
显然是一个解决方案。但我不是很幸运,我必须处理一个复杂的POJO(转换为JSON),其中某些字段(有些是嵌套的)是用java.lang.Long
类型键入的。如果我尝试将此POJO转换为另一个对象没有字段键入Long,则显然很麻烦。
以更清晰的方式解决这个障碍吗?
答案 0 :(得分:66)
在Java中,你有64位整数,这就是你正在使用的。
在JavaScript中,所有数字均为64 bits floating point numbers。这意味着您无法在JavaScript中表示所有Java长度。尾数的大小约为53位,这意味着您的号码793548328091516928
无法准确表示为JavaScript编号。
如果你真的需要处理这些数字,你必须用另一种方式来代表它们。这可以是字符串,也可以是数字数组之类的特定表示。 JavaScript中提供了一些“大数字”库。
答案 1 :(得分:7)
可能会迟到,但绝对可以帮助第一次遇到这种情况的其他人。
我也想在JavaScript中对大数字进行一些计算。有很多库可以处理这些数字。但是大多数人可能会浪费你的大部分时间。 在这里,https://github.com/peterolson/BigInteger.js是一个直接的,完整的(对于非节点环境和节点JS环境),以及可用于大数量的所有操作的工作解决方案。 或者找到以下简单且样本正常的HTML代码片段,用于计算模数/余数,
<script src="http://peterolson.github.com/BigInteger.js/BigInteger.min.js"></script>
<script type="text/javascript">
function modTest(){
var rem = bigInt("1738141852226360940").mod("32").valueOf();
console.log(rem);
document.getElementById("remainder").innerHTML = rem;
}
</script>
<BODY onload="modTest();">
<p id="remainder"></p>
</BODY>
答案 2 :(得分:0)
您可以使用https://developer.here.com/documentation/android-premium/3.15/dev_guide/topics/map-service.html npm软件包。
它使您可以在JavaScript中使用64 bits integers
。
您还可以使用long JavaScript内置方法。