.Number.isFinite(), Number.isNaN()
ES6在Number對象上,新提供了Number.isFinite()和Number.isNaN()兩個方法
Number.isFinite()用來檢查一個數值是否為有限的(finite),即不是Infinity;
Number.isFinite(12) // true Number.isFinite(0.8) // true Number.isFinite(NaN); // false Number.isFinite(Infinity); // false Number.isFinite(-Infinity); // false Number.isFinite('foo'); // false Number.isFinite(true); // false
只要參數類型不是數字,則Number.isFinite一律返回false;
Number.isNaN()用來檢查一個值是否為NaN
Number.isNaN(NaN) // true Number.isNaN(15) // false Number.isNaN(9/NaN) // true Number.isNaN('true' / 0) // true Number.isNaN('true' / 'true') // true
如果參數類型不是NaN,Number.isNaN一律返回false
2.Number.parseInt(), Number.parseFloat()
ES6將全局方法parseInt()和parseFloat(),移植到Number對象上面,行為完全保持一致
// ES5的寫法 parseInt('12.34') // 12 parseFloat('123.45#') // 123.45 // ES6的寫法 Number.parseInt('12.34') // 12 Number.parseFloat('123.45#') // 123.45
這樣做的目的,是逐步減少全局方法,使得語言逐步模塊化。
3. Number.isInterger()
Number.isInterger()用來判斷一個數值是否為整數
Number.isInteger(25) // true Number.isInteger(25.1) // false Number.isInteger(25.0) // true
JavaScript 內部,整數和浮點數采用的是同樣的儲存方法,所以 25 和 25.0 被視為同一個值
如果參數不是整數值,Number.isInterger()返回false
4.Math.trunc()
Math.trunc()方法用于去除一個數的小鼠部分,返回整數部分
Math.trunc(4.1) // 4 Math.trunc(4.9) // 4 Math.trunc(-4.1) // -4 Math.trunc(-4.9) // -4 Math.trunc(-0.1234) // -0
對于非數值,Math.trunc內部使用Number方法將其先轉化為數值。
Math.trunc('123.456') // 123 Math.trunc(true) //1 Math.trunc(false) // 0 Math.trunc(null) // 0
對于空值和無法截取整數的值,返回NaN。
Math.trunc(NaN); // NaN Math.trunc('foo'); // NaN Math.trunc(); // NaN Math.trunc(undefined) // NaN
5.Math.sign()
Math…sign()方法用來判斷一個數到底是正數、負數、還是零。對于非數值,會先將其轉換為數值。
Math.sign()方法返回五種值
-| 參數為正數,返回 +1
-| 參數為負數,返回 -1
-| 參數為0,返回 0
-| 參數為-0,返回 -0
-| 參數為其他值,返回 NaN
Math.sign(-5) // -1 Math.sign(5) // +1 Math.sign(0) // +0 Math.sign(-0) // -0 Math.sign(NaN) // NaN
如果是非數值,會自動轉為數值,對于無法轉化為數值的值,會返回NaN。
Math.sign('') // 0 Math.sign(true) // +1 Math.sign(false) // 0 Math.sign(null) // 0 Math.sign('9') // +1 Math.sign('foo') // NaN Math.sign() // NaN Math.sign(undefined) // NaN
6.Math.cbrt()
Math.cbrt()方法用于計算一個數的立方根。
Math.cbrt(-1) // -1 Math.cbrt(0) // 0 Math.cbrt(1) // 1 Math.cbrt(2) // 1.2599210498948734
7.指數運算符
ES2016中新增了一個指數運算符(**)
2 ** 2==> 2 * 2 // 4 2 ** 3==> 2 * 2 * 2 // 8
類似ES5中的 Math.pow()方法,但是二者在進行特別大的運算時,兩者結果會有細微的差距。
Number和Math都屬于JavaScript中的內置對象,Number數字類型作為基礎數據類型,我們在開發過程中會經常用到,包括數字精度的格式化,還有字符串轉換成數字等操作。
Number.EPSILON 兩個可表示(representable)數之間的最小間隔。
Number.MAX_SAFE_INTEGER JavaScript 中最大的安全整數 (2^53 - 1)。
Number.MAX_VALUE 能表示的最大正數。最小的負數是 -MAX_VALUE。
Number.MIN_SAFE_INTEGER JavaScript 中最小的安全整數 (-(2^53 - 1)).
Number.MIN_VALUE 能表示的最小正數即最接近 0 的正數 (實際上不會變成 0)。最大的負數是 -MIN_VALUE。
Number.NaN 特殊的“非數字”值。
Number.NEGATIVE_INFINITY 特殊的負無窮大值,在溢出時返回該值。
Number.POSITIVE_INFINITY 特殊的正無窮大值,在溢出時返回該值。
new Number實例化數字對象和Number強轉數字字符串,兩個值的并不相等
var value1=new Number("123");
this.value1=value1;
console.log(`value1===123 is ${value1===123}`); // value1===123 is false
var value2=Number("123");
this.value2=value2;
console.log(`value2===123 is ${value2===123}`); // value2===123 is true
// 判斷Number類型
console.log(value1 instanceof Number);
console.log(value2 instanceof Number);
Number("123"); // 123
Number("12.3"); // 12.3
Number("12.00"); // 12
Number("123e-1"); // 12.3
Number(""); // 0
Number(null); // 0
Number("0x11"); // 17
Number("0b11"); // 3
Number("0o11"); // 9
Number("foo"); // NaN
Number("100a"); // NaN
Number("-Infinity"); //-Infinity
let number1=new Number("123");
let number2=123;
let number3="string";
let number4=null;
console.log(Number.isNaN(number1)); // false
console.log(Number.isNaN(number2)); // false
console.log(Number.isNaN(number3)); // false
console.log(Number.isNaN(number4)); // false
console.log(Number.isNaN(NaN)); // true
console.log(Number.isFinite(1 / 0));
// false
console.log(Number.isFinite(10 / 5));
// true
console.log(Number.isFinite(0 / 0));
// false
function checkInteger(x, y) {
if (Number.isInteger(y / x)) {
return "整數";
}
return "非整數";
}
console.log(checkInteger(5, 10));
// "整數"
console.log(checkInteger(5, 11));
// "非整數"
備注:
Number.isSafeInteger() 方法用來判斷傳入的參數值是否是一個“安全整數”(safe integer)。
一個安全整數是一個符合下面條件的整數:
可以準確地表示為一個IEEE-754雙精度數字,
其IEEE-754表示不能是舍入任何其他整數以適應IEEE-754表示的結果。.
比如,2^53 - 1 是一個安全整數,它能被精確表示,在任何 IEEE-754 舍入模式(rounding mode)下,沒有其他整數舍入結果為該整數。作為對比,2^53 就不是一個安全整數,它* 能夠使用 IEEE-754 表示,但是 2^53 + 1 不能使用 IEEE-754 直接表示,在就近舍入(round-to-nearest)和向零舍入中,會被舍入為 2^53。
安全整數范圍為 -(2^53 - 1)到 2^53 - 1 之間的整數,包含 -(2^53 - 1)和 2^53 - 1。
Number.isSafeInteger(3); // true
Number.isSafeInteger(Math.pow(2, 53)); // false
Number.isSafeInteger(Math.pow(2, 53) - 1); // true
Number.isSafeInteger(NaN); // false
Number.isSafeInteger(Infinity); // false
Number.isSafeInteger("3"); // false
Number.isSafeInteger(3.1); // false
Number.isSafeInteger(3.0); // true
備注:
function checkFloat(r) {
return parseFloat(r);
}
console.log(checkFloat(4.567));
// 4.567
console.log(checkFloat("4.567abcdefgh"));
// 4.567
console.log(checkFloat("abcdefgh"));
// NaN
/**
*
* Number.parseInt()
* 方法依據指定基數 [ 參數 radix 的值],把字符串 [ 參數 string 的值] 解析成整數。
* @params string:要解析的值。 如果此參數不是字符串,則使用ToString抽象操作將其轉換為字符串。忽略此參數中的前導空格。
* @params radix:一個介于2到36之間的整數,代表字符串的基數(數學數字系統中的基)。小心-這并不是默認為10。
* 從給定字符串中解析的整數。如果基數小于11,且第一個非空白字符不能轉換為數字,則返回NaN。
*
* */
function checkInt(x, base) {
const parsed=parseInt(x, base);
if (isNaN(parsed)) {
return 0;
}
return parsed * 100;
}
console.log(checkInt(" 0xF", 16));
// 1500
console.log(checkInt("321", 2));
// 0
var numObj=5.123456;
var n=numObj.toFixed(2); // 5.12
var numObj=5.123456;
console.log("numObj.toPrecision() is " + numObj.toPrecision()); // 輸出 5.123456
console.log("numObj.toPrecision(5) is " + numObj.toPrecision(5)); // 輸出 5.1235
console.log("numObj.toPrecision(2) is " + numObj.toPrecision(2)); // 輸出 5.1
console.log("numObj.toPrecision(1) is " + numObj.toPrecision(1)); // 輸出 5
// 注意:在某些情況下會以指數表示法返回
console.log((1234.5).toPrecision(2)); // "1.2e+3"
var d=new Date("December 17, 1995 03:24:00");
console.log(Number(d));
在Number數字類型中,使用最多的應該是:
文章來自https://www.cnblogs.com/akari16/p/16201678.html
天給大家分享的是在Javascript中,獲取到數字超出長度問題。
實戰背景
剛剛收尾的一個移動端商城項目中搭建用戶體系的時候,DB設計的User用戶表主鍵ID為bigint(20) 為了達到不重復的問題 Java生成了16-20位不重復的Long類型數字串(具體生成方式也是非常復雜的)。
但是在和web前端API對接的時候發現獲取到的ID和生成的不一致,導致操作用戶數據的時候一直有問題,最后定位到是ID后端數據類型和Javascript中的數據類型不一致。
問題原因
JavaScript中所有的數字,無論是整數還是小數,其類型均為Number。在程序內部,Number類型的實質是一個64位的浮點數,這與Java中double類型的浮點數是一致的;因此,JavaScript中所有的數都是浮點數。遵循IEEE 754標準(浮點數算術標準),JavaScript所能表示的數值范圍為正負1.7976931348623157乘以10的308次方,其最小所能表示的小數為正負5乘以10的負324次方,這兩個邊界值可以分別通過訪問Number對象的MAX_VALUE屬性和MIN_VALUE屬性來獲取。
對于整數,根據ECMAScript標準的要求(http://ecma262-5.com/ELS5_HTML.htm#Section_8.5),JavaScript能表示并進行精確算術運算的整數范圍為:正負2的53次方,也即從最小值-9007199254740992到最大值+9007199254740992之間的范圍;對于超過這個范圍的整數,JavaScript依舊可以進行運算,但卻不保證運算結果的精度。值得注意的是,對于整數的位運算(比如移位等操作),JavaScript僅支持32位整型數,也即從-2147483648到+2147483647之間的整數。
我們可以瀏覽器中測試一下,如下操作
如上圖所示 是正常的,那么我們再 +1 試試
看到了吧? 都變了!!!!
解決方案1
數據庫設計的時候用varchar(20),那么會映射為String類型,就不會出現這種問題
解決方案2
如果項目已經成型并且修改數據庫會造成不可預料的問題那么可以在User對象中再增加一個String類型id映射字段,如下 private Long userId;
private String userIdStr; public String getUserIdStr() { returnthis.userId+"";
} publicvoidsetUserIdStr(String userIdStr) { this.userIdStr=userIdStr;
}
那么和前端交互的時候可以使用userIdStr字段 因為是String 類型的,規避掉這個問題。
以后在設計的時候記得不要再犯這樣的問題哦!
更多精彩內容請關注“IT實戰聯盟”哦~~~
*請認真填寫需求信息,我們會在24小時內與您取得聯系。