摘要:我們可以用測一下具體實(shí)現(xiàn)原理,請參考文檔注意因?yàn)椴僮鲗⒉僮鲾?shù)轉(zhuǎn)為,所以它不能處理超過位的數(shù)值取整,而有效整數(shù)的范圍是位。綜上所以如果要考慮壓縮代碼的大小,且明確知道數(shù)值范圍不會超過位整數(shù)的時(shí)候,可以考慮使用取整。
在處理數(shù)值的時(shí)候,獲取浮點(diǎn)數(shù)的整數(shù)和小數(shù)部分,是一種常見的操作,在JavaScript中有許多方法可以達(dá)到目的,但也正因?yàn)榉椒ū姸啵阅姆N方法更好,也值得我們仔細(xì)研究一番。
1. parseIntlet num = 3.75; console.log(parseInt(num)); // 3 num = -3.75; console.log(parseInt(num)); // -3
parseInt(3.75),會先將3.75轉(zhuǎn)換成字符串"3.75", 然后在轉(zhuǎn)換成3.
這個(gè)方法是一個(gè)將字符串轉(zhuǎn)換為整數(shù)的方法,如果參數(shù)不是一個(gè)字符串,則將其轉(zhuǎn)換成字符串,性能開銷大。
關(guān)鍵還有一個(gè)致命的問題:
console.log(parseInt(0.00000001)); // 1 console.log(parseInt(1000000000000000000000)); // 1
分析:
這是因?yàn)?strong>toString(),0.00000001.toString()===1e-8而1000000000000000000000..toString() === 1e+21。
function trunc (num) { if (num>=0) { return Math.floor(num) } else { return Math.ceil(num) } } console.log(trunc(3.75)); // 3 console.log(trunc(-3.75)); // -3
使用Math.round和Math.ceil實(shí)現(xiàn)trunc方法,要比使用parseInt的性能好,因?yàn)槭∪チ宿D(zhuǎn)字符串。我們可以用jsperf測一下:
3. Math.trunc()console.log(Math.trunc(3.75)); // 3 console.log(Math.trunc(-3.75)); // -34. |
具體實(shí)現(xiàn)原理,請參考 ECMA-262文檔
log(3.75 | 0); // 3 console.log(-3.75 | 0); // -3
注意:
因?yàn)閎itwise操作將操作數(shù)轉(zhuǎn)為Int32,所以它不能處理超過32位的數(shù)值取整,而JavaScript有效整數(shù)的范圍是53位。
const num = 17179869184.89; console.log(num | 0); // 0 console.log(Math.trunc(num)); // 17179869184
綜上: 所以如果要考慮壓縮代碼的大小,且明確知道數(shù)值范圍不會超過32位整數(shù)的時(shí)候,可以考慮使用 | 0取整。否則,還是使用Math方法吧。
附: 性能測試 https://jsperf.com
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/106304.html
摘要:除此之外的特定形式還有二進(jìn)制序列類型,那么我們在這里所說的序列主要包含以下三種列表列表是一種可變序列,一般形式為,方括號內(nèi)的各項(xiàng)間用逗號分隔。 引言 對于以前沒有接觸過任何編程語言的人來說,首先能明確編程的目的很重要,往往能明確一個(gè)目的,在日后的學(xué)習(xí)中遇到困難時(shí)心態(tài)就會輕松許多。當(dāng)今計(jì)算機(jī)文化的多元化發(fā)展,涌現(xiàn)出了大數(shù)據(jù)、分布式計(jì)算、神經(jīng)網(wǎng)絡(luò)、機(jī)器學(xué)習(xí)等眾多新概念,即便這樣,任何意義上...
摘要:相信大家都知道二進(jìn)制數(shù)按位運(yùn)算的規(guī)則來看一些簡單的例子單純的二進(jìn)制位之間的這些運(yùn)算相當(dāng)簡單,但對我們實(shí)際編程并沒有直接幫助,因?yàn)榫幊踢^程中需要的經(jīng)常是數(shù)字間的運(yùn)算,比如。 先來看LeetCode上的Divide Two Integers題目要求: Divide two integers without using multiplication, division and mod ope...
摘要:取整使用函數(shù)可以輕松的對浮點(diǎn)數(shù)進(jìn)行取整操作。這是因?yàn)楹瘮?shù)在應(yīng)對這種與兩個(gè)整數(shù)距離相同的情況時(shí),會取到最近的偶數(shù)上去。如果你特別需要精確的數(shù)值,那么可以使用模塊。 round()取整 使用round()函數(shù)可以輕松的對浮點(diǎn)數(shù)進(jìn)行取整操作。示例如下: >>> round(1.23, 1) 1.2 >>> round(1.27, 1) 1.3 >>> round(-0.36, 1) -0.4...
摘要:散列表散列表,也叫哈希表,是根據(jù)鍵而直接訪問在內(nèi)存存儲位置的數(shù)據(jù)結(jié)構(gòu)。這個(gè)映射函數(shù)稱做散列函數(shù),存放記錄的數(shù)組稱做散列表。 散列表 散列表(Hash table,也叫哈希表),是根據(jù)鍵(Key)而直接訪問在內(nèi)存存儲位置的數(shù)據(jù)結(jié)構(gòu)。也就是說,它通過計(jì)算一個(gè)關(guān)于鍵值的函數(shù),將所需查詢的數(shù)據(jù)映射到表中一個(gè)位置來訪問記錄,這加快了查找速度。這個(gè)映射函數(shù)稱做散列函數(shù),存放記錄的數(shù)組稱做散列表。 ...
摘要:整數(shù)除法對兩個(gè)不能整除的整數(shù)做除法,就要面對舍入的問題。中的舍入除了缺省的舍入方式,還有多種舍入可供選擇。就是說,我們輸入的十進(jìn)制數(shù),在計(jì)算機(jī)內(nèi)部都是用二進(jìn)制來表示的。 關(guān)于除法,你也許覺得沒什么值得談?wù)摰模吘剐W(xué)的時(shí)候體育老師就教過我們了。然而對于編程中使用的除法,我覺得還是有很多值得注意的細(xì)節(jié)的。為什么我想深究一下?因?yàn)槲胰粘V饕褂肑ava和Python編程,而它們的除法在細(xì)節(jié)...
閱讀 2728·2021-11-11 17:21
閱讀 619·2021-09-23 11:22
閱讀 3583·2019-08-30 15:55
閱讀 1646·2019-08-29 17:15
閱讀 580·2019-08-29 16:38
閱讀 913·2019-08-26 11:54
閱讀 2513·2019-08-26 11:53
閱讀 2757·2019-08-26 10:31