ฉันมีชุดการคำนวณ 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_INFINITYNaN
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
NaNs ฯลฯ
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?