ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript_javascriptスキルにおける数値型の難しさの解説

JavaScript_javascriptスキルにおける数値型の難しさの解説

WBOY
WBOYオリジナル
2016-05-16 18:25:251139ブラウズ

1. 数値は長いです。C# で有効な長整数は実際には...JavaScript では...
次の単純なコード行を見てください:

コードをコピー コードは次のとおりです。

var a = 2010060612120909191 //時間によって生成される Id1
var b = 2010060612120909199; time Id2
alert(a == b); //alert(a); //何か驚くべき発見はありましたか?
//alert(b); //最後の数桁は次のようになります...
//alert(Number(a) == Number(b)); , 10 ) == parseInt(b, 10));
//alert(parseFloat(a) == parseFloat(b));


コードをコピーしてローカルでテストできます。操作の実際の結果は、a と b が等しく、「true」がポップアップ表示されます。とにかく、Lou Zhu は初めてこの状況に遭遇したとき、少し驚きました。その後、Lou Zhu は 2 つの数字をそれぞれポップアップさせたところ、今度は数字が「2010060612120909300」に変わっていることに偶然気づきました。最後に、数値に関連する Number、parseInt、および parseFloat 関数をテストしましたが、3 つの結果は依然として true でした。
次に、Louzhu は次のように数値型を文字列型に調整します。
コード


コードをコピーします コード
var a = "2010060612120909191"; //時間によって生成される Id1
var b = "2010060612120909199"; //時間によって生成される Id2
alert(a ==) b) ;//false
alert(a); //2010060612120909199
alert(Number(a) == Number(b)); >alert (parseInt(a, 10) == parseInt(b, 10));//?
alert(parseFloat(a) == parseFloat(b));//? >this 最初の 3 つは予想通り問題ありませんが、数値型に変換された比較では true が返されます。
ここでテストされた 2 つの数値は JavaScript の数値制限内ではありませんか?しかし、なぜポップアップ番号が「2010060612120909300」(百の桁は奇妙すぎる)に変わったのでしょうか?
自分で検索しても無駄だったので、次の関数を使用して 2 つの長整数の大きさを比較しました:



コードをコピー


コードは次のとおりです。 else if (isNaN(prevNum) | | prevNum.length == 0) {
throw new Error("2 番目の入力は数値ではありません");
}
var result = 0; // 結果 0: 2 は等しい:最初の数値が 2 番目の -1 より大きい: 2 番目の数値が最初の数値より大きい
if (prevNum.length > nextNum.length) {
result ;
}
else if (prevNum.length 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); ; parseInt(charNum2)) {
結果 ;
}
else if (parseInt(charNum2) > parseInt(charNum1)) {
結果--; >}
return result;
}


2. 小数点の場合、parseInt の選択
この問題は、いくつかの JavaScript 書籍で説明されています。以下のコードを見てください:




コードをコピー


コードは次のとおりです:

var a = 0.000001;
var b = 0.0000001;
alert(parseInt(b));// 10 が入力されていないからですか? 16 進数の理由はすでにご存知かもしれません。 parseInt(b) は 1 を返します!次に、a と b を文字列に置き換えてテストします。
コードをコピーします コードは次のとおりです:

var a = "0.000001";
var b = "0.0000001";
alert(parseInt(b));
今回は、a と b の両方が 0 を返します。これは私たちが望んでいる予想される結果です。そこでLou Zhu氏は大胆な推測をしました。JavaScriptが0から始まる数値を処理する場合、8進数として扱われることがあるとのことです。この考え、kaoは理にかなっています。しかし、ここでテストした 2 つの浮動小数点数 a と b はどちらも 0 から始まります。まあ、Lou Zhu は他に理由が思いつかなかったので、テストするために、奇妙な結果を生成した数値 b を parseInt(b, 10) に変更する必要がありました。それはまだ 1 でした。次に、Louzhu は Number と parseFloat をテストしました:
コードをコピーします コードは次のとおりです:

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

はは、今度はルー・ジュウが真実を発見することに近づいているようです。 bNumber と parseFloat の後に、科学表記法である 1e-7 が表示されます。どうやら実際には8進数の問題のようです。その後、nclouzhu は、まず parseInt にする数値を String または String に変換することで問題を解決できると当然のことと考えました。

コードをコピー コードは次のとおりです。
var b = 0.0000001
alert(parseInt(b.toString(), 10)); 10));


くそー、なぜ今回はまだ 1 なのですか?これを次のように変更しても同じです:


コードをコピーします コードは次のとおりです:
var b = String (0.0000001);
alert(parseInt(b));


では、この 8 進数の parseInt が科学表記法で数値を返すには、どうすればよいでしょうか。丸めて?開発ニーズに応じて、関数を簡単に実装できる Math 関数があります。


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


よく使われるfloorメソッドとceilメソッドの違いについてJavaScript の数学関数については、関連ドキュメントを参照してください。ここでは説明しません。最後に、貴重なご意見やご提案をお待ちしております。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。