ฉันมีชุดการคำนวณ Javascript ที่ (เฉพาะใน IE) แสดง Infinity ขึ้นอยู่กับตัวเลือกของผู้ใช้
หนึ่งจะหยุดคำที่Infinity
ปรากฏและตัวอย่างเช่นแสดง0.0
แทนได้อย่างไร
ฉันมีชุดการคำนวณ Javascript ที่ (เฉพาะใน IE) แสดง Infinity ขึ้นอยู่กับตัวเลือกของผู้ใช้
หนึ่งจะหยุดคำที่Infinity
ปรากฏและตัวอย่างเช่นแสดง0.0
แทนได้อย่างไร
คำตอบ:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
คุณอาจใช้isFinite
ฟังก์ชันนี้แทนได้ขึ้นอยู่กับว่าคุณต้องการรักษาNaN
อย่างไร isFinite
ผลตอบแทนfalse
ถ้าจำนวนของคุณPOSITIVE_INFINITY
, หรือNEGATIVE_INFINITY
NaN
if (isFinite(result))
{
// ...
}
Infinity
คุณสมบัติไม่ได้อ่านอย่างเดียวซึ่งหมายความว่ามันสามารถนิยามใหม่: ตัวอย่างเช่นvar x = 42; Infinity = 42; alert(x === Infinity);
การแสดง"ความจริง" (เป็นที่ยอมรับว่าเป็นกรณีที่ชัดเจนและทุกคนที่ตัดสินใจที่จะ redefine Infinity
, NaN
ฯลฯ ควรคาดหวังสิ่งที่แปลกที่เกิดขึ้น.)
Number.(POSITIVE|NEGATIVE)_INFINITY
ไม่ใช่แบบอ่านอย่างเดียวInfinity
คืออ่านอย่างเดียวในโหมดเข้มงวด แล้ว-?1/0
กรณีที่ฉันนำเสนอให้คุณล่ะ? อย่างไรก็ตามคุณควรใช้isFinite
แทนกันเกือบตลอดเวลา
Number.POSITIVE_INFINITY
และNumber.NEGATIVE_INFINITY
เป็นแบบอ่านอย่างเดียว (ทดสอบบน Chrome8, FF3.6 และ IE8) การใช้1/0
งานได้ผลดี แต่จะไม่ชัดเจนนักสำหรับผู้ดูแลโค้ดของคุณว่าคุณกำลังพยายามทดสอบอะไรอยู่ ฉันยอมรับว่าการใช้isFinite
มักจะเป็นวิธีที่ดีกว่าในการทำสิ่งต่างๆนั่นคือเหตุผลที่ฉันพูดถึงในคำตอบของฉัน - แต่มีเพียง OP เท่านั้นที่สามารถตัดสินใจได้ว่าตรงตามข้อกำหนดของพวกเขาหรือไม่
Object.defineProperty
บนมืออื่น ๆ ที่เป็นที่ไม่ใช่การกำหนดค่าในโหมดที่เข้มงวด __defineGetter__
Infinity
ง่ายn === n+1
หรือใช้n === n/0
งานได้:
function isInfinite(n) {
return n === n/0;
}
โปรดทราบว่าเนทีฟisFinite()
บีบบังคับอินพุตเป็นตัวเลข isFinite([])
และisFinite(null)
เป็นทั้งtrue
ตัวอย่าง
n === n+1
ประเมินเป็นจริงสำหรับตัวเลขทั้งหมดที่มีขนาดใหญ่กว่า 2 ^ 53 เช่น 1e30 แฮ็คการแบ่งใช้งานได้แม้กระทั่งสำหรับ NaN และ -Infinity อย่างไรก็ตามคำตอบของ LukeH ช่วยให้คุณอ่านโค้ดได้ง่ายขึ้น
n+1
ไม่สามารถแสดงได้และอาจมีการปัดเศษ แม้แต่จำนวนเต็มก็ได้รับผลกระทบจากข้อผิดพลาดในการปัดเศษ Btw ฉันไม่คิดว่ารหัสของคุณคือ "คณิตศาสตร์หลักฐาน" n === n/-0
เพียงแค่พยายาม เมื่อเติมจำนวนจริงด้วย +/- inf ขีด จำกัด ของคุณจะไม่ถูกกำหนดไว้อย่างชัดเจนเว้นแต่ว่าลำดับศูนย์ที่อยู่ภายใต้จะถือว่าเป็นค่าบวก
ในES6
การNumber.isFinite()
วิธีการกำหนดว่าค่าผ่านเป็นจำนวน จำกัด
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
จริงๆแล้ว n === n + 1 จะใช้ได้กับตัวเลขที่ใหญ่กว่า 51 บิตเช่น
1e16 + 1 === 1e16; // true
1e16 === Infinity; // false
ผมชอบที่จะใช้Lodashสำหรับความหลากหลายของการเข้ารหัสป้องกันเหตุผลเช่นเดียวกับการอ่าน ES6 Number.isFinite
ดีมากและไม่มีปัญหากับค่าที่ไม่ใช่ตัวเลข แต่ถ้า ES6 ไม่สามารถทำได้แสดงว่าคุณมี lodash อยู่แล้วหรือต้องการรหัส briefer: _.isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
ฉันพบสถานการณ์ที่ทำให้ฉันต้องตรวจสอบว่าค่าเป็นNaN
หรือInfinity
ประเภท แต่ส่งสตริงเป็นผลลัพธ์ที่ถูกต้อง เนื่องจากสตริงข้อความจำนวนมากจะสร้างผลบวกที่ผิดพลาดNaN
ฉันได้ทำวิธีง่ายๆเพื่อหลีกเลี่ยงสิ่งนั้น:
const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
โค้ดด้านบนจะแปลงค่าเป็นสตริงและตรวจสอบว่ามีค่าเท่ากับ NaN หรือ Infinity อย่างเคร่งครัดหรือไม่ (คุณจะต้องเพิ่มกรณีอื่นสำหรับค่าอินฟินิตี้เชิงลบ)
ดังนั้น:
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
NaN
s ฯลฯ
toString()
แทน อย่าลังเลที่จะลงคะแนนหรือระบุเหตุผลที่อาจให้ผลลัพธ์ที่ไม่สอดคล้องกันได้อย่างไรหรือเหตุใดจึงไม่แนะนำให้ใช้วิธีนี้ จนถึงตอนนี้ฉันยังรู้สึกว่ามันเพิ่มตัวเลือกสำหรับใครก็ตามที่กำลังมองหาคำตอบและไม่มีเหตุผลที่เป็นรูปธรรมว่าทำไมสิ่งนี้ถึงอันตรายไม่เสถียร ฯลฯ
คุณสามารถใช้isFiniteในหน้าต่างisFinite(123)
:
คุณสามารถเขียนฟังก์ชันเช่น:
function isInfinite(num) {
return !isFinite(num);
}
และใช้เช่น:
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
คุณยังสามารถNumber.isFinit
ตรวจสอบว่าค่าเป็น Number ด้วยหรือไม่และมีความแม่นยำมากขึ้นสำหรับการตรวจสอบundefined
และnull
อื่น ๆ
หรือคุณสามารถทำpolyfillได้ดังนี้:
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITY
แทน-?Infinity
หรือ-?1/0
?