JavaScript에서 큰 숫자가 잘못 반올림되었습니다.
문제:
아래 이 코드에서는: Firefox의
3.5에서 jsonParsed의 값은 반올림된 숫자입니다.
다양한 값을 시도했지만 항상 반올림된 숫자를 얻었습니다.
나도 반올림 규칙을 이해하지 못합니다. 714341252076979136은 714341252076979200으로 반올림되고, 714341252076979135는 714341252076979100으로 반올림됩니다.
이게 왜요?
답변:
JavaScript 숫자 유형의 용량을 초과하고 있습니다. 사양의 섹션 8.5와 IEEE-754 배정밀도 이진 부동 소수점에 대한 Wikipedia를 참조하세요. 자세한 내용은 형식 페이지를 참조하세요. 이러한 ID는 문자열이어야 합니다.
IEEE-754 배정밀도 부동 소수점(JavaScript에서 사용하는 숫자 유형)은 (물론) 모든 숫자를 정확하게 나타낼 수는 없습니다. 0.1 0.2 === 0.3은 거짓입니다. 이것이 유명합니다. 이는 분수에 영향을 미치는 것처럼 정수에도 영향을 미칩니다. 9,007,199,254,740,991(Number.MAX_SAFE_INTEGER)에서 시작합니다.
Number.MAX_SAFE_INTEGER 1(9007199254740992)이 초과되어 IEEE-754 부동 소수점 형식은 더 이상 각각의 연속된 정수를 나타낼 수 없습니다. 9007199254740991 1은 9007199254740992이지만 9007199254740992 1도 9007199254740992입니다. 9007199254740993은 이 형식으로 표현할 수 없기 때문입니다. 다음으로 표현할 수 있는 것은 9007199254740994이다. 그러면 9007199254740995를 나타낼 수 없지만 9007199254740996을 나타낼 수 있습니다.
이유는 비트가 부족하여 더 이상 1s 비트가 없기 때문입니다. 이제 가장 낮은 비트는 2의 배수를 나타냅니다. 결국 계속하면 해당 비트가 손실되고 4의 배수로만 작동하게 됩니다. 등.
귀하의 값은 해당 임계값을 훨씬 초과하므로 표현 가능한 가장 가까운 값으로 반올림됩니다.
ES2020부터는 BigInt를 사용하여 임의의 큰 정수를 표현할 수 있지만 이를 표현할 수 있는 JSON은 없습니다. 문자열과 복원 기능을 사용할 수 있습니다.
(실제 콘솔에서 보면 프래그먼트 콘솔은 BigInt를 이해하지 못합니다.)
위 내용은 JavaScript JSON 구문 분석에서 큰 숫자가 잘못 반올림되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!