BigInt 类型在从十进制到十六进制的转换中没有保留

BigInt type isn't maintained in conversion to hex from decimal

我有一些包含大量数字的数据,我读入这些数据并将其存储为字符串。我需要将它们转换为十六进制字符串,但是当我尝试使用 BigInt(decimalString).toString(16) 时,bigInt 类型没有保留,因为十六进制值的最后一个字符仍然被截断。

const decimal = '18446744072635809797'
console.log(decimal)
// Expected: 18446744072635809797 Actual: 18446744072635810000 FAIL

console.log(BigInt(decimal))
// Expected: 18446744072635809792n Actual: 18446744072635809792n SUCCESS

console.log(BigInt(decimal).toString(16))
// Expected: ffffffffc0000005 Actual: "ffffffffc0000000 FAIL

最奇怪的部分是在 JSFiddle 中尝试使用相同的代码完全按预期工作,但在我的环境中却没有。这是我的 tsconfig:

{
    "compilerOptions": {
     "target": "ES5",
     "lib": ["dom", "dom.iterable", "esnext", "ESNext.BigInt"],
     "allowJs": true,
     "skipLibCheck": true,
     "esModuleInterop": true,
     "allowSyntheticDefaultImports": true,
     "strict": true,
     "forceConsistentCasingInFileNames": true,
     "noFallthroughCasesInSwitch": true,
     "module": "esnext",
     "moduleResolution": "node",
     "resolveJsonModule": true,
     "isolatedModules": true,
     "noEmit": true,
     "jsx": "react-jsx"
    },
"include": ["src"]
}

我看到浏览器(Edge 和 Chrome)之间也发生了同样的行为。我错过了什么?

json文件基本上是这样的 { 一:18446744072635809797 } 我使用接口将其保存到 javascript 对象以将其转换为字符串:

interface IData{
  a: string
}

service.GetData().then((data: IData) => {
  if(data.a > Number.MAX_SAFE_INTEGER){
    const decimal = BigInt(data.a)
    // attempt to convert decimal to hex
  }
})

The json file is basically something like this { a: 18446744072635809797 }

那是你的问题:该值是一个数字,并且被解析为一个数字。 JSON 应该是 { a: "18446744072635809797" },然后您可以通过将此字符串传递给 BigInt 函数来获得您期望的行为,例如BigInt(data.a).toString(16).

TypeScript 接口定义不会导致执行任何转换。即使这样做了,到 JSON.parse returns 时已经太晚了,因为无法存储在 Number 中的位在那个时候已经丢失了。

自己看看:

> JSON.parse('{ "a": 18446744072635809797 }')
← {a: 18446744072635810000}
> JSON.parse('{ "a": "18446744072635809797" }')
← {a: '18446744072635809797'}