>  기사  >  웹 프론트엔드  >  JavaScript_javascript 기술의 숫자 유형의 어려움에 대한 설명

JavaScript_javascript 기술의 숫자 유형의 어려움에 대한 설명

WBOY
WBOY원래의
2016-05-16 18:25:251083검색

1. 숫자가 깁니다. C#에서 허용되는 긴 정수는 실제로... JavaScript에서는...
다음의 간단한 코드 줄을 살펴보세요.

코드 복사 코드는 다음과 같습니다.

var a = 2010060612120909191; //시간별로 생성된 Id1
var b = 2010060612120909199; time Id2
alert(a == b);
//alert(a); //놀라운 결과가 있나요?
//alert(b); //마지막 몇 자리는 다음과 같습니다.
//alert(Number(a) == Number(b))
//alert(parseInt(a) , 10 ) == parsInt(b, 10));
//alert(parseFloat(a) == parseFloat(b))

코드를 복사하여 로컬에서 테스트할 수 있습니다. . 실제 연산 결과는 a와 b가 동일하고 "true"가 팝업되는 것입니다. 어쨌든 루주는 처음으로 이런 상황에 직면했을 때 약간 놀랐다. 그러자 Lou Zhu는 각각 두 개의 숫자가 팝업되도록 했고, 이번에는 우연히 숫자가 "2010060612120909300"으로 변경된 것을 발견했습니다. 마지막으로 숫자와 관련된 Number,parseInt,parseFloat 함수를 테스트했는데 세 가지 결과가 여전히 true였습니다.
그런 다음 Louzhu는 다음과 같이 숫자 유형을 문자열 유형으로 조정합니다.
코드
코드 복사 코드

var a = "2010060612120909191"; //시간에 따라 생성된 Id1
var b = "2010060612120909199" //시간에 따라 생성된 Id2
alert(a == b) ;//false
alert(a); //2010060612120909191
alert(b); //2010060612120909199
alert(Number(a) == Number(b)); >alert(parseInt(a, 10) ==parseInt(b,10));//?
alert(parseFloat(a)==parseFloat(b));//?

this 예상대로 처음 세 개는 문제가 없지만 숫자 유형으로 변환된 비교는 여전히 true를 반환합니다.
여기에서 테스트한 두 숫자는 JavaScript의 수치 제한 내에 있지 않습니까? 그런데 왜 팝업번호가 "2010060612120909300"(100자리는 너무 이상해요)으로 바뀌었나요?
스스로 검색해도 소용이 없었고 다음 함수를 사용하여 두 개의 긴 정수의 크기를 비교했습니다.

코드 복사 코드는 다음과 같습니다.
//숫자 비교(두 입력은 문자열 또는 숫자형, 긴 숫자형 숫자 비교)
function CompareNumber(prevNum, nextNum) {
if ( isNaN(prevNum) || prevNum.length == 0) {
throw new Error("첫 번째 입력은 숫자가 아닙니다.")
}
else if (isNaN(prevNum) | | prevNum.length == 0) {
throw new Error("두 번째 입력은 숫자가 아닙니다.")
}
var result = 0: 2는 1입니다. 첫 번째 숫자가 두 번째 숫자보다 큽니다. -1: 두 번째 숫자가 첫 번째 숫자보다 큽니다.
if (prevNum.length > nextNum.length) {
result
}
else if (prevNum. length < nextNum .length) {
result--;
}
else {
//자릿수가 같습니다
for (var i = 0; i < prevNum .length; i ) {
var charNum1 = prevNum.toString().charAt(i)
var charNum2 = nextNum.toString().charAt(i)
if (parseInt(charNum1) > ;parseInt(charNum2)) {
결과 ;
break;
}
else if (parseInt(charNum2) >parseInt(charNum1)) {
결과--; >}
return result;
}


2. 소수점을 사용하는 경우 parInt
이 문제는 일부 자바스크립트 책에서 논의되었습니다. 아래 코드를 보세요.



코드 복사
코드는 다음과 같습니다. var a = 0.000001; var b = 0.0000001; alert(parseInt(a))
alert(parseInt(b))
//alert(parseInt(b, 10)); 10이 채워지지 않아서 그런걸까요?


이미 알고 계시겠지만. parseInt(b)는 1을 반환합니다! 그런 다음 a와 b를 문자열로 바꾸고 테스트합니다.



코드를 복사합니다.
코드는 다음과 같습니다. var a = "0.000001"; var b = "0.0000001"; alert(parseInt(a))
alert(parseInt(b));
이번에는 a와 b 모두 0을 반환합니다. 이것이 우리가 원하는 예상 결과입니다. 그러자 Lou Zhu는 JavaScript가 0으로 시작하는 숫자를 처리할 때 때때로 8진수로 처리된다는 대담한 추측을 내렸습니다. 카오, 이 아이디어는 말이 됩니다. 그런데 여기서 테스트한 두 개의 부동 소수점 숫자 a와 b는 모두 0으로 시작하나요? 글쎄, Lou Zhu는 다른 이유를 전혀 생각할 수 없었기 때문에 이상한 결과를 생성한 숫자 b를 테스트하기 위해 parsInt(b, 10)로 변경해야 했습니다. 여전히 1이었습니다. 그런 다음 Louzhu는 Number 및 ParseFloat를 테스트했습니다.
코드를 복사합니다. 코드는 다음과 같습니다.

var a = 0.000001;
var b = 0.0000001;
alert(Number(a))
alert(Number(b));//1e-7
alert(parseFloat(a)) ;
alert(parseFloat(b)); //1e-7

하하, 이번에는 Lou Zhu가 거의 진실을 발견한 것 같습니다. bNumber와 parsFloat 뒤에 과학 표기법인 1e-7이 나타납니다. 정말 8진수 문제인 것 같습니다. 그런 다음 nclouzhu는 먼저 parsInt가 될 숫자를 문자열 또는 문자열로 변환하여 문제를 해결할 수 있다고 당연하게 여겼습니다.
코드 복사 코드는 다음과 같습니다.

var b = 0.0000001;
alert(parseInt(b.toString(), 10))
alert(parseInt(String(b), 10));

젠장, 이번엔 왜 아직도 1이야? 다음과 같이 변경해도 그대로 유지됩니다.
코드를 복사하세요. 코드는 다음과 같습니다.

var b = String (0.0000001);
alert(parseInt(b));

그러므로 이 8진수parseInt가 과학 표기법으로 숫자를 반환하려면 어떻게 해야 할까요? 둥글게? 개발 요구에 따라 Math에는 함수를 쉽게 구현하는 데 도움이 되는 함수가 있습니다.
코드 복사 코드는 다음과 같습니다.

var b = 0.0000001;
alert(Math.floor(b))

일반적으로 사용되는 바닥 방법과 천장 방법의 차이점은 JavaScript의 수학 함수는 관련 문서를 참조할 수 있으며 여기서는 설명하지 않습니다. 마지막으로 여러분의 소중한 의견과 제안을 기다리겠습니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.