0으로 나누면 무한대입니까?

5058 단어 webdevjavascript

소개



freeCodeCamp 미터법-제국 변환기 프로젝트를 마무리하면서 이상한 버그를 발견했습니다. 가능한 사용자 입력은 3/4mi 와 같이 단위가 있는 분수입니다. 그러나 사용자가 입력할 가능성이 있습니다3/0mi. 콘솔에서 이것을 테스트하기로 결정하고 다음을 얻었습니다.

3/0
// Infinity

오류를 예상했지만 값을 얻었습니다 Infinity . 이유를 알아낼 수 있는지 알아보기 위해 이것을 살펴보겠습니다.

탐구하다



먼저, 예상 결과인지 확인하기 위해 MDN으로 이동했습니다.

2.0 / 0     // Infinity

2.0 / 0.0   // Infinity, because 0.0 === 0

2.0 / -0.0  // -Infinity

예상한 답변인 것 같지만, 뭔가를 알아차렸습니다. 음수 0으로 나누면 음수 무한대가 됩니다. 그것이 무엇을 의미하는지 확실하지 않아 ECMAScript를 확인하기로 결정했습니다.

NOTE: ECMAScript is the official specification of JavaScript.



ECMAScript에 따르면 :

The result is determined by the specification of IEEE 754-2019 arithmetic

...

Division of a nonzero finite value by a zero results in a signed infinity. The sign is determined by the rule already stated above



불행히도 IEEE 문서에 액세스할 수 없습니다. 그래서 나의 여행은 여기서 끝이다. 그러나 여기에 주제에 대해 찾은 몇 가지lecture notes, see pg 10가 있습니다.

해결책



처음에는 try/catch 솔루션을 시도했습니다.

var [numerator, denominator] = num.split('/');
try {
    // The plus converts a string to a number
    result = +(numerator) / +(denominator);
} catch(e) {
    throw new RangeError('Cannot divide by zero');
}
// Infinity

예상대로 Infinity 를 얻습니다. MDN 검색 중 유용한 방법을 찾았습니다 [isFinite]:( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite )

The global isFinite() function determines whether the passed value is a finite number. If needed, the parameter is first converted to a number.



나는 그것을 사용하여 최종 솔루션을 찾았습니다.

if (isFinite(result)) {
  return result;    
}
return 'Cannot divide by zero';

물론 사용자가 Infinity/Infinity를 입력할 수 있지만 다른 시간을 위해 저장하겠습니다.

마지막 생각들



0으로 나누면 오류가 발생하지 않는다는 점이 흥미로웠습니다. ECMAScript가 구현하는 IEEE 사양에 따르면 규칙을 따릅니다. 코딩 여정에서 주의해야 할 사항. 기대하는 결과가 그렇게 명확하지 않을 수 있습니다.

자원



MDN - Division(/)
ECMAScript 6.1.6.1.5
MDN - isFinite

이미지는 Dota 2의 Lina입니다.

좋은 웹페이지 즐겨찾기