摘要:基礎極值采用標準的位雙精度格式存儲數值。如果數值的精度超過此限度,第位及后面的會被丟棄。數值的極值分為兩種可表示的極值和可精確計算的極值浮點型不算。超過精度的數值可正確顯示,但由其計算得出的結果可能不準確。整型數值安全區間。
ES6為數值增加了些常量和方法,使計算更為簡便安全。本篇概括了這中的精華知識。
1 基礎 1.1 極值JS采用IEEE 754標準的64位雙精度格式存儲數值。
數值的精度最多可達到53個二進制位(1個隱藏位和52個有效位)。
如果數值的精度超過此限度,第54位及后面的會被丟棄。
數值的極值分為兩種:可表示的極值和可精確計算的極值(浮點型不算)。
可表示的極值:[5e-324, 1.7976931348623157e+308]。
可精確計算的極值:[1 - Math.pow(2, 53), Math.pow(2, 53) - 1]。
超過精度的數值可正確顯示,但由其計算得出的結果可能不準確。 let num = 9007199254741002; console.log( num ); // 9007199254741002 console.log( num + 1 ); // 9007199254741004 console.log( num + 3 ); // 9007199254741004 let n1 = Math.pow(2, 53) - 1 + 1 + 1; let n2 = Math.pow(2, 53) - 1 + 1 + 2; console.log(n1 === n2); // true
對于整數,最多能精確顯示16個十進制位,超過會被截斷。
對于小數,最多能精確顯示小數點后16個十進制位,超過會被截斷。
超過的位數會被截斷。 console.log( 3.000000000000001 === 3 ); // false console.log( 3.0000000000000001 === 3 ); // true console.log( 0.123456789123456891 ); // 0.12345678912345691.2 進制
二進制:0b100或0B。
八進制:0o100或0O或0100。
十六進制:0x100或0X100。
注意,可忽略0100格式表八進制,因為嚴格模式下不允許使用。
進制間的轉化
使用進制的完整格式,通過toString在不同進制間轉化。
console.log( (10).toString(2) ); // 1010 console.log( (0b100).toString(8) ); // 4 console.log( ("0o100").toString(16) ); // 40
使用進制的值,通過parseInt將其它進制轉換成十進制。
console.log( parseInt(100, 2) ); // 4 console.log( parseInt(100, 8) ); // 64 console.log( parseInt("100", 16) ); // 256
使用進制的完整格式,通過Number將其它進制轉化成十進制。
console.log( Number(0b100) ); // 4 console.log( Number("0o100") ); // 64 console.log( Number("0x100") ); // 2562 Number
完整的API列表:地址。
此模塊的方法,不會默認轉化期待為數值類型而實際不是的參數。
將全局方法isFinite() & isNaN(),放到了Number模塊下。
兩者唯一的差別是,全局中的方法會默認轉化非數值參數,Number模塊下的不會。
console.log( isNaN("NaN") ); // true - 等價于 console.log( isNaN(Number("NaN")) ); 只要不是 NaN ,則為 false 。更為嚴格嚴謹。 console.log( Number.isNaN("NaN") ); // false2.2 整數
增加了一些常量和方法為安全計算服務。
isInteger()
判斷一個數值是否為整數。非數直接為false。
在JS中,整數和浮點數的儲存方式是相同的,所以25和25.0被視為同一個值。
console.log( Number.isInteger("25") ); // false console.log( Number.isInteger(25.0) ); // true console.log( Number.isInteger(3.0000000000000002) ); // true
isSafeInteger()
判斷整型數值是否處于安全區間內。非整型即為false。
整型數值安全區間:[Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]。
判斷一個算式及其結果是否安全,需要驗證它的各個項以及結果。
isTrusty(9007199254740993, 990, 9007199254740993 - 990); // 報錯 function isTrusty(left, right, result) { if (Number.isSafeInteger(left) && Number.isSafeInteger(right) && Number.isSafeInteger(result)) { return result; } throw new RangeError("Operation cannot be trusted!"); }2.3 誤差
JS能識別的最小精度為Number.EPSILON,即Math.pow(2, -52)。
如果誤差小于此精度,就可以認為這點誤差已經沒有意義,即不存在誤差了。
在實際項目中,可以設置計算的容錯誤差,以對比兩個浮點數應不應該相同等等。
console.log( 0.1 + 0.2 ); // 0.30000000000000004 console.log( (0.1 + 0.2) === 0.3 ); // false console.log( isEqualInErrorRange(0.1 + 0.2, 0.3) ); // true function isEqualInErrorRange(left, right) { return Math.abs(left - right) < Number.EPSILON; }
設定需要精確的位數,將浮點型轉化成整型,來較為安全的計算浮點數。
console.log( countFloat(0.1, 0.2, "+", 14) ); // 0.3 function countFloat(a, b, sign, num) { let res; let times = Math.pow(10, num); let _a = Math.floor(a * times); let _b = Math.floor(b * times); switch (sign) { case "-": res = isTrusty(_a, _b, _a - _b); break; case "+": res = isTrusty(_a, _b, _a + _b); break; case "/": res = isTrusty(_a, _b, _a / _b); break; case "*": res = isTrusty(_a, _b, _a * _b); break; } return res / times; }3 Math
完整的API列表:地址。
此模塊的方法,會默認調用Number()轉化,期待為數值類型而實際不是的參數。
此模塊新增了些,可以自行實現的簡易方法,直接查手冊會更有效,就不列舉了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95692.html
摘要:本篇概括了中正則表達式新增部分的精華要點最好有的基礎。標志使正則處于模式。關于的字符擴展知識,可查看這里。四字節字符處于模式下的正則,可以正確識別位四字節字符。 本篇概括了ES6中正則表達式新增部分的精華要點(最好有ES5的基礎)。 1 u 標志 使正則處于Unicode模式。 關于ES6的字符擴展知識,可查看這里。 1.1 四字節字符 處于Unicode模式下的正則,可以正確識別3...
摘要:四字節字符大幅增強了對字節位字符的支持。內部使用編碼規則網頁通常為。字符固定為字節,字節為位二進制,其碼點小于。有些符號的碼點大于,需字節表示,即常說的位字符。表示方法新增一種表示字符的方法。用將碼點括起,使其可直接表示超過的值。 1 四字節字符 ES6大幅增強了對4字節(32位)字符的支持。 JS內部使用UTF-16編碼規則(網頁通常為UTF-8)。 1字符固定為2字節,1字節為...
摘要:前言新增了兩種基本的原生數據集合和加上和現在共有四種,以及由兩者衍生出的弱引用集合和。其本身是生成實例數據集合的構造函數,可以接受一個數組或具有接口的數據結構作為參數用來初始化。返回鍵值對的遍歷器對象,鍵值對為鍵名鍵值。 前言 ES6新增了兩種基本的原生數據集合:Set和Map(加上Array和Object現在共有四種),以及由兩者衍生出的弱引用集合:WeakSet和WeakMap。從...
摘要:在函數方面的擴展比較豐富也很實用,本篇概括了這中的精華知識。所以無法成為構造函數,不能使用操作符。參數將擴展運算符作用于參數,即為參數。聲明式,直接為函數名。通過構造函數生成的,為。函數的屬性,在其描述對象的屬性上,為函數名。 ES6在函數方面的擴展比較豐富也很實用,本篇概括了這中的精華知識。 1 箭頭函數 箭頭函數是ES6中定義函數的新形式。 新形式不僅簡化了定義方式,更為函數本身...
閱讀 1292·2023-04-26 01:03
閱讀 1907·2021-11-23 09:51
閱讀 3299·2021-11-22 15:24
閱讀 2663·2021-09-22 15:18
閱讀 1010·2019-08-30 15:55
閱讀 3458·2019-08-30 15:54
閱讀 2234·2019-08-30 15:53
閱讀 2387·2019-08-30 15:44