المعرفة:: JavaScript الحالة::مؤرشفة المراجع:: The Complete JavaScript Course 2022 From Zero to Expert, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt
How numbers work in JavaScript?
- In JavaScript, all numbers are presented internally as floats.
console.log(23 === 23.0); // true- Also, numbers are presented internally in 64-bits base 2 format. (always in binary, similar to PHP and Ruby)
- The decimal.js library provides an arbitrary-precision Decimal type for JavaScript.
- Floating point math.
// Base 10 - 0 to 9. 1/10 = 0.1. 3/10 = 3.3333333
// Binary base 2 - 0 1
console.log(0.1 + 0.2); // 0.300000000000000004
console.log(0.1 + 0.2 === 0.3); // falseConvert a string to number
// Conversion
console.log(Number("23")); // 23
console.log(+"23"); // 23See Also: Type Conversion and Coercion
Parse number from a string
parseIntandparseFloatare global functions.- It’s preferred to use them from
Numberobject. - It’s useful in situations like reading value from css without the unit.
// parseInt(string, base)
console.log(Number.parseInt("30px")); // 30
console.log(Number.parseInt("e23")); // NaN
console.log(Number.parseInt("30px", 10)); // 30
console.log(Number.parseInt("e23", 10)); // NaN
console.log(Number.parseFloat("2.5rem")); // 2.5
console.log(Number.parseInt("2.5rem")); // 2
// whitespace doesn't affect anything
console.log(Number.parseInt(" 2.5rem ")); // 2
console.log(Number.parseFloat(" 2.5rem ")); // 2.5
// console.log(parseFloat(' 2.5rem ')); // also worksMore: MDN.
Checking if value is NaN
console.log(Number.isNaN(20)); // false
console.log(Number.isNaN("20")); // false
console.log(Number.isNaN(+"20X")); // true
console.log(Number.isNaN(23 / 0)); // trueChecking if value is number
console.log(Number.isFinite(20)); // true
console.log(Number.isFinite("20")); // false
console.log(Number.isFinite(+"20X")); // false
console.log(Number.isFinite(23 / 0)); // false
console.log(Number.isInteger(23)); // true
console.log(Number.isInteger(23.0)); // true
console.log(Number.isInteger(23 / 0)); // falseJavaScript Math Operations
Square Root
console.log(Math.sqrt(25)); // 5
console.log(25 ** (1 / 2)); // 5Cubic Root
console.log(8 ** (1 / 3)); // 2Max Value
- It does Type Coercion but doesn’t parse numbers.
console.log(Math.max(5, 18, 23, 11, 2)); // 23
console.log(Math.max(5, 18, "23", 11, 2)); // 23
console.log(Math.max(5, 18, "23px", 11, 2)); // NaNMinimum Value
console.log(Math.min(5, 18, 23, 11, 2)); // 2PI
console.log(Math.PI * Number.parseFloat("10px") ** 2); // 314.1592653589793Random
// Get random number from 1 to 6
Math.trunc(Math.random() * 6) + 1; // This is not okay for negative numbers
// Get random number from 1 to 20
Math.floor(Math.random() * 20) + 1;
// 0...1 -> 0...(max - min) -> min...max
const randomInt = (min, max) => Math.floor(Math.random() * (max - min) + 1) + min;
console.log(randomInt(10, 20));Rounding Integers
All these methods does Type Coercion.
truncreturns the integer part of a number by removing any fractional digits.roundreturns the value of a number rounded to the nearest integer.ceilrounds a number up to the next largest integer.floorreturns largest integer less than or equal to a given number (rounds down).
// Rounding integers
console.log(Math.round(23.3)); // 23
console.log(Math.round(23.9)); // 24
console.log(Math.ceil(23.3)); // 24
console.log(Math.ceil(23.9)); // 24
console.log(Math.floor(23.3)); // 23
console.log(Math.floor("23.9")); // 23
console.log(Math.trunc(23.3)); // 23
console.log(Math.trunc(-23.3)); // -23
console.log(Math.floor(-23.3)); // -24Rounding Decimals
toFixedformats a number using fixed-point notation, returns a string.
// Rounding decimals
console.log((2.7).toFixed(0)); // 3
console.log((2.7).toFixed(3)); // 2.700
console.log((2.345).toFixed(2)); // 2.35
console.log(+(2.345).toFixed(2)); // 2.35Remainder Operator
- The remainder operator (%) returns the remainder left over when one operand is divided by a second operand.
- It can be used for operations that needs to do something with the nth repeat. For example doing something every 2nd / 3rd / 5th time.
console.log(5 % 2); // 1
console.log(5 / 2); // 2.5 - 5 = 2 * 2 + 1
console.log(8 % 3); // 2
console.log(8 / 3); // 8 = 2 * 3 + 2
// is even
console.log(6 % 2); // 0
console.log(6 / 2); // 3
// is odd
console.log(7 % 2); // 1
console.log(7 / 2); // 3.5
const isEven = n => n % 2 === 0;
console.log(isEven(8)); // true
console.log(isEven(23)); // false
console.log(isEven(514)); // trueNumeric Separators
- Introduced in ES2021.
- Allows us for format numbers to be easily readable and understandable using underscore.
- Underscore is only allowed between numbers.
- Converting strings formatted with underscores to numbers won’t work well.
// Numeric Separators
// 287,460,000,000
const diameter = 287_460_000_000;
console.log(diameter); // 287460000000
const price = 345_99;
console.log(price); // 34599
const transferFee1 = 15_00;
const transferFee2 = 1_500;
const PI = 3.14_15;
console.log(PI); // 3.1415
console.log(Number("230000")); // 230000
console.log(Number("230_000")); // NaN
console.log(parseInt("230_000")); // 230BigInt
- In JavaScript, numbers are represented internally as 64 bits, that means that there are exactly 64 ones or zeros to represent any given number, of these 64 bits only 53 are used to actually store the digits themselves while the rest are used for storing the position of the decimal point and the sign.
- Number’s maximum safe integer in JavaScript is
2^53 - 1(9 quadrillion).
console.log(2 ** 53 - 1); // 9007199254740991
const x = Number.MAX_SAFE_INTEGER + 1;
const y = Number.MAX_SAFE_INTEGER + 2;
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991
console.log(x); // 9007199254740992
console.log(x === y); // true- For larger integers
BigIntshould be used. - A
BigIntvalue, is a primitive, created by appending n to the end of an integer literal, or by calling theBigInt()function (without the new operator) and giving it an integer value or string value.
console.log(4838430248342043823408394839483204n); // 4838430248342043823408394839483204n
console.log(BigInt(48384302));Operations
BigIntvalues and normalNumbervalues can’t be mixed. Except for the following cases.
console.log(10000n + 10000n); // 20000n
console.log(36286372637263726376237263726372632n * 10000000n); // 362863726372637263762372637263726320000000n
// console.log(Math.sqrt(16n));
const huge = 20289830237283728378237n;
const num = 23;
console.log(huge * num); // TypeError: Cannot mix BigInt and other types, use explicit conversions
console.log(huge * BigInt(num));Exceptions
- Logical operators, like comparing
BigIntwith number. - String concatenations.
console.log(20n > 15); // true
console.log(20n === 20); // false
console.log(typeof 20n); // bigint
console.log(20n == "20"); // true
console.log(huge + " is REALLY big!!!");Divisions
- The / operator works as expected with whole numbers — but operations with a fractional result will be truncated when used with a
BigIntvalue — they won’t return any fractional digits.
console.log(11n / 3n); // 3n
console.log(10 / 3); // 3.33333333335Numbers Internationalization
- The
Intl.NumberFormatobject enables language-sensitive number formatting. It acceptsoptionsparameter for further customization.
// new Intl.NumberFormat(locales, options)
const num = 3884764.23;
const options = {
style: 'currency',
unit: 'celsius',
currency: 'EUR',
// useGrouping: false,
};
console.log('US: ', new Intl.NumberFormat('en-US', options).format(num)); // US: €3,884,764.23
console.log('Germany: ', new Intl.NumberFormat('de-DE', options).format(num)); // Germany: 3.884.764,23 €
console.log('Syria: ', new Intl.NumberFormat('ar-SY', options).format(num)); // Syria: ٣٬٨٨٤٬٧٦٤٫٢٣ €Formatting currencies
const formatCur = function (value, locale, currency) {
return new Intl.NumberFormat(locale, {
style: "currency",
currency: currency,
}).format(value);
};