导致C和JavaScript之间存在这种行为差异的原因是什么?

Siy*_*iya 6 javascript c

鉴于下面的C代码:

int nSum       = 0;
// pNumber is 9109190866037
int nDigits    = strlen(pNumber);
int nParity    = (nDigits-1) % 2;
char cDigit[2] = "\0";
for (int i = nDigits; i > 0 ; i--)
{
  cDigit[0]  = pNumber[i-1];
  int nDigit = atoi(cDigit);

  if (nParity == i % 2) {
    nDigit = nDigit * 2;
  }

  nSum += nDigit/10;
  nSum += nDigit%10;
  printf("NUMBER: %d\n", nSum);
}
Run Code Online (Sandbox Code Playgroud)

输出:

NUMBER: 13
NUMBER: 13
NUMBER: 16
NUMBER: 22
NUMBER: 29
NUMBER: 29
NUMBER: 38
NUMBER: 39
NUMBER: 48
NUMBER: 48
NUMBER: 50
NUMBER: 59
NUMBER: 59
Run Code Online (Sandbox Code Playgroud)

这个JavaScript代码(用TypeScript编写,所以实际上这里也涉及打字,但主要是推断):

let nSum = 0;
let nDigits = partialIdNumber.length;
let nParity = (nDigits - 1) % 2;
let cDigit = "\0";
for (let i = nDigits; i > 0; i--) {

  cDigit = partialIdNumber[i - 1];
  let nDigit = parseInt(cDigit);

  if (nParity == i % 2) {
    nDigit  = nDigit * 2;
  }
  nSum += nDigit / 10;
  nSum += nDigit % 10;
  console.log("NUMBER: %d", nSum);
}
Run Code Online (Sandbox Code Playgroud)

输出:

NUMBER: 14.3
NUMBER: 14.3
NUMBER: 17.5
NUMBER: 24.1
NUMBER: 31.700000000000003
NUMBER: 31.700000000000003
NUMBER: 41.5
NUMBER: 42.6
NUMBER: 52.4
NUMBER: 52.4
NUMBER: 54.6
NUMBER: 64.5
Run Code Online (Sandbox Code Playgroud)

注意:这两种实现都是相同的,只是不同的语言.

C代码产生预期的结果而JavaScript不产生.

问题

  1. JavaScript为产生输出做了哪些假设?
  2. 我必须更改我的JavaScript代码的哪一部分才能生成所需的输出?

Nin*_*olz 3

使用除法后需要将数字转换为整数值。

var partialIdNumber ='9109190866037'

let nSum = 0;
let nDigits = partialIdNumber.length;
let nParity = (nDigits - 1) % 2;
let cDigit = "\0";
for (let i = nDigits; i > 0; i--) {
    cDigit = partialIdNumber[i - 1];
    let nDigit = +cDigit;
    if (nParity == i % 2) {
        nDigit  = nDigit * 2;
    }
    nSum += Math.floor(nDigit / 10); // int
    nSum += nDigit % 10;
    console.log("NUMEBR: %d", nSum);
}
Run Code Online (Sandbox Code Playgroud)