Saya memiliki serangkaian perhitungan Javascript yang (hanya di bawah IE) menunjukkan Infinity tergantung pada pilihan pengguna.
Bagaimana cara seseorang menghentikan Infinity
kemunculan kata dan misalnya, muncul 0.0
?
Jawaban:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
Anda mungkin bisa menggunakan isFinite
fungsi tersebut, tergantung bagaimana Anda ingin memperlakukannya NaN
. isFinite
kembali false
jika nomor Anda POSITIVE_INFINITY
, NEGATIVE_INFINITY
atau NaN
.
if (isFinite(result))
{
// ...
}
Infinity
Properti 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
, NaN
dll harus mengharapkan hal-hal aneh terjadi.)
Number.(POSITIVE|NEGATIVE)_INFINITY
juga bukan hanya-baca, Infinity
adalah hanya-baca dalam mode ketat. Juga, bagaimana dengan -?1/0
kasus yang saya perlihatkan kepada Anda? Bagaimanapun, Anda hampir selalu harus menggunakan isFinite
.
Number.POSITIVE_INFINITY
dan Number.NEGATIVE_INFINITY
yang read-only (diuji pada Chrome8, FF3.6 dan IE8). Menggunakan 1/0
berfungsi dengan baik tetapi tidak akan terlalu jelas bagi pengelola kode Anda apa yang sebenarnya Anda coba uji. Saya setuju bahwa menggunakan isFinite
hampir 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.defineProperty
dan __defineGetter__
. Infinity
, Di sisi lain, adalah non-dikonfigurasi dalam mode ketat.
Sederhana n === n+1
atau n === n/0
bekerja:
function isInfinite(n) {
return n === n/0;
}
Ketahuilah bahwa native isFinite()
memaksa input ke angka. isFinite([])
dan isFinite(null)
keduanya true
sebagai contoh.
n === n+1
mengevaluasi 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+1
tidak 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.isFinite
bagus 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 NaN
atau Infinity
tetapi 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
NaN
s, 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.isFinit
e yang juga memeriksa apakah nilainya juga Angka dan lebih akurat untuk memeriksa undefined
dan null
lain - lain ...
Atau Anda dapat mengisinya seperti ini:
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITY
alih-alih-?Infinity
atau-?1/0
?