国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS 的整型你懂了嗎?

yuanxin / 2789人閱讀

摘要:浮點(diǎn)數(shù)并不是能夠精確表示范圍內(nèi)的所有數(shù)的,雖然浮點(diǎn)型的范圍看上去很大。但其實(shí)浮點(diǎn)數(shù)在保存數(shù)字的時(shí)候做了規(guī)格化處理,以進(jìn)制為例小數(shù)點(diǎn)前只需要保留位數(shù)對(duì)于二進(jìn)制來說,小數(shù)點(diǎn)前保留一位,規(guī)格化后始終是節(jié)省了,這個(gè)并不需要保存。

JS 中的最大安全整數(shù)是多少?

JS 中所有的數(shù)字類型,實(shí)際存儲(chǔ)都是通過 8 字節(jié) double 浮點(diǎn)型 表示的。浮點(diǎn)數(shù)并不是能夠精確表示范圍內(nèi)的所有數(shù)的, 雖然 double 浮點(diǎn)型的范圍看上去很大: 2.23x10^(-308) ~ 1.79x10^308。 可以表示的最大整數(shù)可以很大,但能夠精確表示,使用算數(shù)運(yùn)算的并沒有這么大。

它其實(shí)連這樣的簡單加法也會(huì)算錯(cuò):

console.log(0.1 + 0.2)
//output: 0.30000000000000004

所以在 js 中能夠安全使用的有符號(hào) 安全 大整數(shù)(注意這里是指能夠安全使用,進(jìn)行算數(shù)運(yùn)算的范圍),并不像其他語言在 64 位環(huán)境中那樣是:

2^63 - 1;//9223372036854775807

而是

Math.pow(2, 53) - 1     // 9007199254740991

JS 的最大和最小安全值可以這樣獲得:

console.log(Number.MAX_SAFE_INTEGER); //9007199254740991
console.log(Number.MIN_SAFE_INTEGER); //-9007199254740991

通過下面的例子,你會(huì)明白為什么大于這個(gè)值的運(yùn)算是不安全的:

var x = 9223372036854775807;
console.log(x === x + 1);// output: true
console.log(9223372036854775807 + 1000); //output: 9223372036854776000

這些運(yùn)算都是錯(cuò)誤的結(jié)果, 因?yàn)樗鼈冞M(jìn)行的都是浮點(diǎn)數(shù)運(yùn)算會(huì)丟失精度。

為什么是這個(gè)值?

double 浮點(diǎn)數(shù)結(jié)構(gòu)如下:

1 位符號(hào)位

11 位指數(shù)位

52 位尾數(shù)位

使用 52 位表示一個(gè)數(shù)的整數(shù)部分,那么最大可以精確表示的數(shù)應(yīng)該是 2^52 - 1 才對(duì), 就像 64 位表示整數(shù)時(shí)那樣: 2^63 - 1 (去掉 1 位符號(hào)位)。 但其實(shí)浮點(diǎn)數(shù)在保存數(shù)字的時(shí)候做了規(guī)格化處理,以 10 進(jìn)制為例:

20*10^2 => 2*10^3 //小數(shù)點(diǎn)前只需要保留 1 位數(shù)

對(duì)于二進(jìn)制來說, 小數(shù)點(diǎn)前保留一位, 規(guī)格化后始終是 1.***, 節(jié)省了 1 bit,這個(gè) 1 并不需要保存。

如何處理大整數(shù)

Nodejs 越來越多的應(yīng)用到后端的開發(fā)中, 不可避免的需要處理這樣的溢出問題, 好在已經(jīng)有很多優(yōu)秀的第三方庫來解決該問題:bignum、bigint。

大整數(shù)與數(shù)據(jù)庫

Mysql 能處理的各個(gè)整形范圍如下

//每種類型的第二行為無符號(hào)范圍
TYPE         BYTE   MIN            MAX
TINYINT      1     -128            127
                                   255
SMALLINT     2    -32768          32767
                                  65535
MEDIUMINT    3    -8388608       8388607
                                 16777215
INT          4   -2147483648    2147483647
                                4294967295
BIGINT       8  -9223372036854775808    9223372036854775807
                                       18446744073709551615

BIGINT 就是 64 位整數(shù), 一旦要處理的數(shù)據(jù)量超過了 BIGINT 能存儲(chǔ)的范圍,便要考慮使用字符串保存, 壞處是數(shù)字的算數(shù)運(yùn)算需要通過應(yīng)用程序使用大整數(shù)庫來處理,不能依賴于數(shù)據(jù)庫。

注: 常常看到 BIGINT(5) 或者 INT(10), 括號(hào)里的 5 或 10 只是表示展示寬度,并不影響數(shù)的精度范圍和存儲(chǔ)字節(jié)數(shù),需要與 VARCHAR(100)或 DECIMAL(10,2)區(qū)分開

如何處理要求精度的運(yùn)算?

當(dāng)涉及財(cái)物類型的運(yùn)算時(shí), 位數(shù)一般不會(huì)溢出, 但精度要求回更高。數(shù)據(jù)庫保存這些值時(shí),需要使用 DECIMAL (NUMERIC 類型與之相同) 類型保存字段, 防止精度丟失。

小心位移操作

前面討論了可以使用的安全整數(shù)范圍,但在做位移操作時(shí)請小心:位移操作時(shí),會(huì)將整數(shù)截?cái)酁?32 位有符號(hào)整型。也就是說超出這個(gè)范圍的位移操作將會(huì)得到錯(cuò)誤的值。例如:

196 << 24;// 輸出: -1006632960 正確應(yīng)為: 3288334336

位移的一些技巧可以戳 -> 這里

延伸閱讀

代碼之謎(四)- 浮點(diǎn)數(shù)(從驚訝到思考)

如果你有更好的關(guān)于浮點(diǎn)數(shù)相關(guān)學(xué)習(xí)資料, 希望能留言推薦!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/85574.html

相關(guān)文章

  • JS 中的閉包是什么?

    摘要:大名鼎鼎的閉包面試必問。閉包的作用是什么。看到閉包在哪了嗎閉包到底是什么五年前,我也被這個(gè)問題困擾,于是去搜了并總結(jié)下來。關(guān)于閉包的謠言閉包會(huì)造成內(nèi)存泄露錯(cuò)。閉包里面的變量明明就是我們需要的變量,憑什么說是內(nèi)存泄露這個(gè)謠言是如何來的因?yàn)椤? 本文為饑人谷講師方方原創(chuàng)文章,首發(fā)于 前端學(xué)習(xí)指南。 大名鼎鼎的閉包!面試必問。請用自己的話簡述 什么是「閉包」。 「閉包」的作用是什么。 首先...

    Enlightenment 評(píng)論0 收藏0
  • 【C語言基礎(chǔ)之類型轉(zhuǎn)換】

    摘要:類型轉(zhuǎn)換的原則占用內(nèi)存字節(jié)數(shù)少值域小的類型,向占用內(nèi)存字節(jié)數(shù)多值域大的類型轉(zhuǎn)換,以保證精度不降低。隱式類型轉(zhuǎn)換隱式轉(zhuǎn)換也稱為自動(dòng)轉(zhuǎn)換,遵循一定的規(guī)則,由編譯器自動(dòng)完成。 ...

    jsliang 評(píng)論0 收藏0
  • JS基礎(chǔ)篇--函數(shù)聲明與定義,作用域,函數(shù)聲明與表達(dá)式的區(qū)別

    摘要:在中,有四種方式可以讓命名進(jìn)入到作用域中按優(yōu)先級(jí)語言定義的命名比如或者,它們在所有作用域內(nèi)都有效且優(yōu)先級(jí)最高,所以在任何地方你都不能把變量命名為之類的,這樣是沒有意義的形式參數(shù)函數(shù)定義時(shí)聲明的形式參數(shù)會(huì)作為變量被至該函數(shù)的作用域內(nèi)。 Scoping & Hoisting 例: var a = 1; function foo() { if (!a) { var ...

    TerryCai 評(píng)論0 收藏0
  • 深入理解Java整型類型:如何實(shí)現(xiàn)2+2=5?

    摘要:先看下這段神奇的代碼執(zhí)行結(jié)果那么到底做了什么神奇的事情呢先看代碼所以這個(gè)例子其實(shí)包含了中整型類型的一個(gè)知識(shí)點(diǎn)。最后打印出來的值,實(shí)際上是的返回值。只有當(dāng)輸入?yún)?shù)不在區(qū)間內(nèi),才執(zhí)行代碼,基于輸入?yún)?shù)創(chuàng)建一個(gè)新的實(shí)例。 先看下這段神奇的Java代碼: public static void main(String[] args) throws Exception { doSom...

    aristark 評(píng)論0 收藏0
  • 關(guān)于php的printf系列函數(shù)的文章進(jìn)行排錯(cuò),雖已100%測試過。

    摘要:如果對(duì)應(yīng)的變量中的值是個(gè)科學(xué)記數(shù)法的值,它會(huì)進(jìn)行壓縮然后插入到原字符串對(duì)應(yīng)的符號(hào)位置,例如按照常規(guī)轉(zhuǎn)換為如果使用它會(huì)壓縮轉(zhuǎn)換為。它取消掉了調(diào)用函數(shù)的參數(shù),直接輸出了使用方式相同,惟一不同的是它把存放對(duì)應(yīng)變量的參數(shù)可以作為數(shù)組方式傳入。 字符相關(guān): %s - 對(duì)應(yīng)的變量雙引號(hào)中的值按照原樣的內(nèi)容插入到原字符串對(duì)應(yīng)的%s符號(hào)位置。 %c - 參考百度百科->標(biāo)準(zhǔn)ASCII表相當(dāng)于chr...

    nifhlheimr 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<