it-source

bigint: 12000000000002539의 JSON 전송은 12000000000002540으로 변환됩니까?

criticalcode 2023. 3. 22. 21:39
반응형

bigint: 12000000000002539의 JSON 전송은 12000000000002540으로 변환됩니까?

raw data를 다음과 같이 전송합니다.[{id: 12000000000002539, Name: "Some Name"}]그리고 나는 그 대상을 얻고 있다.[{id: 12000000000002540, Name: "Some Name"}]해석 후 서버 측에서 id를 문자열로 변환하는 것이 도움이 될 것 같습니다.하지만 bigint 데이터를 올바르게 전송할 수 있는 더 좋은 방법이 있을까요?

이 값은 실제로 JavaScript의 최대 수치(1.7 정도)를 넘지 않습니다308.

그러나 이 은 "통합 정밀도" 범위를 초과하고 있습니다.잘못된 번호가 전송된 것이 아니라 리터럴 12000000000002539가 12000000000002540만큼 정확하게 표현될 수 있기 때문에 JavaScript에는 올바른 수치가 존재하지 않습니다.(인테그레이션의 범위는53 약 +/- 2입니다).

이것은, 2배의 상대 정밀도(IEEE-754 speak의 바이너리64) 타입을 사용해 정수를 포함한 모든 수치를 격납하는 흥미로운 현상입니다.

12000000000002539 === 12000000000002540 // true

수치로 정확하게 저장되는 최대 유효 자릿수는 15(실제로는 15.95)입니다.위의 경우 17자리 유효자리가 존재하기 때문에 일부 최하위 정보는 사일런트하게 손실됩니다. 경우 JavaScript 파서/엔진이 리터럴 값을 읽습니다.

JavaScript에서 이 크기의 정수만 안전하게 처리할 수 있는 방법은 문자열 리터럴을 사용하거나 다른 방식으로 분해하는 것입니다(예: 커스텀 숫자 유형이나 "bigint 라이브러리").다만, 문자열은 사람이 읽을 수 있고, 비교적 콤팩트하고(JSON에서는 2글자만 추가), 특별한 시리얼화가 필요 없기 때문에 사용하는 것을 추천합니다.이 경우 값은 "id"일 뿐이므로 수학은 필요 없습니다.

해피 코딩.

언급URL : https://stackoverflow.com/questions/8663298/json-transfer-of-bigint-12000000000002539-is-converted-to-12000000000002540

반응형