2017-11-16 1 views
7

나는 문제에 직면했고 나는 그것을 아주 잘 설명 할 수 없다. 사실 나는 꽤 놀랐다. 숫자 9933272057275866을 1 씩 증가 시키면 자동으로 2가 추가됩니다 !!!9933272057275866은 매직 넘버입니까?

let test = 9933272057275866; 
let test2 = test+1; 
console.log('Before:', test); 
console.log('After:', test2); 
console.log('Sub:', test2-test); 

그리고 각각의 출력 :

Before: 9933272057275866 
After: 9933272057275868 
Sub: 2 

하는 방법이 가능할 수 다음 코드를 참조하십시오?

환경은 자바 스크립트입니다. Hackerrank에서 도전 과제를 제출했을 때이 문제를 발견했다. 그런 다음 node.js의 내 환경에서도 동일한 작업을 시도했다. 같은 결과!

현재 무슨 일입니까?

+3

* 부동 소수점 연산이 잘못되었습니다! * –

+5

Number.isSafeInteger (9933272057275866) === false 읽기 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger – Ryan

+0

@ Ryan 아주 좋은 기사 –

답변

8

기본적으로 64 비트 (*)는 숫자를 정확하게 표현하기에 충분하지 않기 때문입니다.

  • 4341 A521 1037 32ED

    : 9.93327205727586 6 ⨉ 10 15
  • 4341 A521 1037 32EE : 9.93327205727586 8 ⨉ 10 15

는 그들 사이에 하나의 정수를 생략하는 방법을 참조하십시오. IEEE 754에서는 숫자가 높을수록 번호가 숫자에 따라 더 많이 퍼집니다. 염두에 두어야 할 점은 부동 소수점 수는 이고 근사값은입니다. 이것은 당신이이 결과를 얻을 이유 :

0.1 + 0.2 === 0.3 // false 

IEEE 754의 최대 안전 정수 부동 소수점를 arithmetics와 9007199254740991.

더 재미있는 사실입니다 :

A + B == B + A    // true, commutative, except when A or B is NaN 
(A + B) + C == A + (B + C) // false, not associative 

* 그것은 언급 할 가치가있다 JavaScript (ECMAScript)의 숫자는 64 비트 IEEE 754 복식으로 표시됩니다. ref

+1

'/// false, not associative' 이상은'// 항상 그렇지는 않습니다., ... '가되어야합니다. – Kaiido

+1

@Kaiido 수학적인 문장이지만 코드 블록에있을 때 약간 혼란 스럽습니다. LaTeX 형식의 텍스트가 있습니다. –

+0

@Kaiido 어떤 이유로 LaTeX는 SO에서 지원되지 않지만 다른 SE 사이트에 있습니다. 불행히도 그게 내가 할 수있는 최선이야. –