Saya memiliki serangkaian perhitungan Javascript yang (hanya di bawah IE) menunjukkan Infinity tergantung pada pilihan pengguna.
Bagaimana cara seseorang menghentikan Infinitykemunculan kata dan misalnya, muncul 0.0?
Jawaban:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
Anda mungkin bisa menggunakan isFinitefungsi tersebut, tergantung bagaimana Anda ingin memperlakukannya NaN. isFinitekembali falsejika nomor Anda POSITIVE_INFINITY, NEGATIVE_INFINITYatau NaN.
if (isFinite(result))
{
// ...
}
InfinityProperti global bukan hanya-baca yang berarti dapat didefinisikan ulang: Misalnya, var x = 42; Infinity = 42; alert(x === Infinity);menampilkan "benar" . (Memang itu kasus yang tidak jelas, dan siapa pun yang memutuskan untuk mendefinisikan ulang Infinity, NaNdll harus mengharapkan hal-hal aneh terjadi.)
Number.(POSITIVE|NEGATIVE)_INFINITYjuga bukan hanya-baca, Infinity adalah hanya-baca dalam mode ketat. Juga, bagaimana dengan -?1/0kasus yang saya perlihatkan kepada Anda? Bagaimanapun, Anda hampir selalu harus menggunakan isFinite.
Number.POSITIVE_INFINITYdan Number.NEGATIVE_INFINITY yang read-only (diuji pada Chrome8, FF3.6 dan IE8). Menggunakan 1/0berfungsi dengan baik tetapi tidak akan terlalu jelas bagi pengelola kode Anda apa yang sebenarnya Anda coba uji. Saya setuju bahwa menggunakan isFinitehampir selalu merupakan cara yang lebih baik untuk melakukan sesuatu - itulah mengapa saya menyebutkannya dalam jawaban saya - tetapi hanya OP yang dapat memutuskan apakah itu memenuhi persyaratan mereka.
Object.definePropertydan __defineGetter__. Infinity, Di sisi lain, adalah non-dikonfigurasi dalam mode ketat.
Sederhana n === n+1atau n === n/0bekerja:
function isInfinite(n) {
return n === n/0;
}
Ketahuilah bahwa native isFinite()memaksa input ke angka. isFinite([])dan isFinite(null)keduanya truesebagai contoh.
n === n+1mengevaluasi ke true untuk semua bilangan yang lebih besar dari 2 ^ 53, yaitu, 1e30. Peretasan divisi berfungsi, bahkan untuk NaN dan -Infinity. Namun, jawaban LukeH memberi Anda kode yang lebih mudah dibaca.
n+1tidak dapat direpresentasikan dan dapat dibulatkan. Nah, bahkan bilangan bulat dipengaruhi oleh kesalahan pembulatan. Ngomong-ngomong, menurut saya kode Anda tidak "tahan matematika", coba saja n === n/-0. Saat melengkapi real dengan +/- inf, batas Anda tidak terdefinisi dengan baik kecuali urutan nol yang mendasarinya diasumsikan positif.
Di ES6, Number.isFinite()Metode menentukan apakah nilai yang diteruskan adalah bilangan terbatas.
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
Saya suka menggunakan Lodash untuk berbagai alasan pengkodean pertahanan serta keterbacaan. ES6 Number.isFinitebagus dan tidak memiliki masalah dengan nilai non-numerik, tetapi jika ES6 tidak memungkinkan, Anda sudah memiliki lodash, atau menginginkan kode yang lebih singkat: _.isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
Saya telah mengalami skenario yang mengharuskan saya untuk memeriksa apakah nilainya dari tipe NaNatau Infinitytetapi meneruskan string sebagai hasil yang valid. Karena banyak string teks akan menghasilkan positif palsu NaN, saya telah membuat solusi sederhana untuk mengelak itu:
const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
Kode di atas mengubah nilai menjadi string dan memeriksa apakah nilainya benar-benar sama dengan NaN atau Infinity (Anda harus menambahkan case lain untuk infinity negatif).
Begitu:
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
NaNs, dll.
toString()? Jangan ragu untuk memberi suara negatif atau menyatakan alasan bagaimana hal ini dapat memberikan hasil yang tidak konsisten atau mengapa metode ini tidak disarankan. Sejauh ini, saya masih merasa ini menambahkan opsi bagi siapa pun yang mencari jawaban dan tidak ada alasan konkret mengapa ini berbahaya, tidak stabil, dll.
Anda dapat menggunakan isFinite di jendela, isFinite(123):
Anda dapat menulis fungsi seperti:
function isInfinite(num) {
return !isFinite(num);
}
Dan gunakan seperti:
isInfinite(null); //false
isInfinite(1); //false
isInfinite(0); //false
isInfinite(0.00); //false
isInfinite(NaN); //true
isInfinite(-1.797693134862316E+308); //true
isInfinite(Infinity); //true
isInfinite(-Infinity); //true
isInfinite(+Infinity); //true
isInfinite(undefined); //true
Anda juga dapat Number.isFinite yang juga memeriksa apakah nilainya juga Angka dan lebih akurat untuk memeriksa undefineddan nulllain - lain ...
Atau Anda dapat mengisinya seperti ini:
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITYalih-alih-?Infinityatau-?1/0?