javascript - 是什么导致了 C 和 JavaScript 之间的这种行为差异?
问题描述
给定下面的 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);
}
输出:
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
还有这段 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);
}
输出:
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
注意:这两种实现都是相同的,只是语言不同。
C 代码会产生预期的结果,而 JavaScript 不会。
问题
- JavaScript 做了哪些假设来产生该输出?
- 我必须更改 JavaScript 代码的哪一部分才能产生所需的输出?
解决方案
您需要在使用除法后将数字转换为整数值。
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);
}
推荐阅读
- mysql - MySQL LEFT OUTER JOIN 选择最佳匹配而不更改 sql_mode
- javascript - ReactJS/Javascript/Graphql/React-apollo:无法读取未定义的属性“加载”
- jquery - Jquery分离/附加分离的一部分
- sql - 将数据从 Excel 导入 SQL
- c++ - 网络流量捕获的内部结构
- angular - 单击复选框以选择行将隐藏该行的内容
- python-3.x - 我在 django 2.0 Reverse 中遇到错误,因为找不到参数 '('',)' 的 'delete'。尝试了 1 种模式:['delete\\/(?P
[^/]+)\\/$'] - c# - 通过数据网格中的其他两列获取列值
- git - 更新了 .gitignore 文件,但状态仍然报告未暂存的文件
- php - 混合身份验证 Facebook 登录引发异常