使用Python中的大整数模拟JavaScript添加错误

时间:2017-08-19 14:22:59

标签: javascript python web integer integer-overflow

有点奇怪的请求:我正在从网站解析API参数。这些参数由网站上的JavaScript处理,以向API服务器发出请求。以某种方式选择参数,将它们相加以形成另一个参数(参见参数c):

var c = 97210102839047737+67973223506388211;
[...]

var plans = new Array();
$.ajax({

  url: 'info/?c='+c,
  dataType: 'json',

  success: function(data) {
[...]
  }
});

JavaScript似乎存在大整数问题,无法正确添加它们。我想用python模拟这种行为,因为我想自动化提取和请求过程。 用javascript添加两个数字会产生:

console.log(97210102839047737+67973223506388211)
VM109:1 165183326345435970

虽然Python正确地将其添加到:

>>> print(97210102839047737+67973223506388211)
165183326345435948

有关如何在python中模拟此错误的任何建议吗?

非常感谢! :)

2 个答案:

答案 0 :(得分:1)

本质上,JavaScript限制是所有数字以浮点表示形式存储的结果(忽略JavaScript支持的类型化数组)。

因此,如果强制Python执行添加为浮动,则可以获得类似的效果:

print(97210102839047737+67973223506388211)
print(int(float(97210102839047737)+float(67973223506388211)))
  

165183326345435948
  165183326345435968

答案 1 :(得分:1)

JavaScript使用floating point numbers来表示其所有数字,无论它们是整数还是实际实数。所以你所看到的是精确的人工制品,它们的大小非常大。

在Python中复制它的方法是使用浮点数。你的表达可以成为:

>>> print(float(97210102839047737)+float(67973223506388211))
1.6518332634543597e+17
>>> 1.6518332634543597e+17 == float(165183326345435970)
True

这与上面的数字相同,但呈现略有不同。科学而不是一串数字。但数量是一样的。