我试图理解为什么模运算不能按预期工作:

我需要验证IBAN,算法包括做模。

根据维基百科:
enter link description here

3214282912345698765432161182 mod 97 = 1

根据我的Windows计算器::
3214282912345698765432161182 mod 97 = 1

但是当我在JS中执行时,我得到65:

var result = 3214282912345698765432161182 % 97;
console.log(result);
// result is 65


为什么我在JS中得到65,而不是1?

最佳答案

查看其他解决您直接问题的答案。如果您想自己解决实际问题,请按以下方法解决。可能已经有一个库在执行此操作,但是有可能它使用如下所述的相同方法。

引用您链接到的the very wikipedia page:



让我们用一个例子来看看如何实现这种方法:

D = 3214282912345698765432161182

让我们将此数字分为四个部分:
P1 = 321428291 // first 9 digits
P2 = 2345698   // next 7 digits
P3 = 7654321   // next 7 digits
P4 = 61182     // last 5 digits

然后,根据维基百科D % 97 == 1,如果以下步骤将您引导至N % 97 == 1:
  • 从D(P1)的的前9位构造N
    N = 321428291
  • 计算N mod 97 = 70
  • 根据上述结果(步骤2)构造一个新的9位N,然后是D(P2)的后7位
    N = 702345698
  • 计算N mod 97 = 29
  • 根据上述结果(步骤4)构造一个新的9位N,然后是D(P3)的后7位
    N = 297654321
  • 计算N mod 97 = 24
  • 根据以上结果(步骤6)构造一个新的N,然后在后面保留D的5位数字(P4)
    N = 2461182
  • 计算N mod 97 = 1



  • 这是dfsq提供的类似方法的简单ES6实现:

    function checkIBAN(iban) {
      const parts = iban.match(/.{1,6}/g);
      return parts.reduce((prev, curr) => Number(prev + curr) % 97, '');
    }
    console.log(checkIBAN("3214282912345698765432161182"));

    10-05 20:34
    查看更多