成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript實(shí)現(xiàn) 超范圍的數(shù) 相加

gself / 1021人閱讀

摘要:?jiǎn)栴}實(shí)現(xiàn)字符串類型的數(shù)字相加的一個(gè)方法??偨Y(jié)好的,最開始提到的問題已經(jīng)解決了,準(zhǔn)確的說,文中的代碼只是實(shí)現(xiàn)了超出范圍的正整數(shù)相加,不支持負(fù)整數(shù)和小數(shù),也許我們可以繼續(xù)去做點(diǎn)什么。

問題

實(shí)現(xiàn) 字符串類型的數(shù)字 相加的一個(gè)方法。
比如:
輸入 "11111111111111111" ,"22222222222222222"
返回 "33333333333333333"

解決思路

JavaScript 能表示的最大安全整數(shù)是 9007199254740991,可以用API Number.MAX_SAFE_INTEGER 看一下

超出范圍就會(huì)發(fā)生精度丟失,像這樣

至于更詳細(xì)的關(guān)于精度丟失的問題,推薦看這篇文章
該死的IEEE-754浮點(diǎn)數(shù),說「約」就「約」,你的底線呢?以JS的名義來好好查查你

這個(gè)問題中的兩個(gè)數(shù)字,都是超出范圍的,所以就不能簡(jiǎn)單的把兩個(gè)數(shù)字,轉(zhuǎn)為Number類型,進(jìn)行相加。

需要取兩個(gè)數(shù)字的每一位,進(jìn)行相加,大于10,就進(jìn)1,把結(jié)果保存在一個(gè)字符串中。

代碼
function add(a,b){
    // 保存最終結(jié)果
    var res="";
    
    // 保存兩位相加的結(jié)果 和 進(jìn)位值
    var c=0;
    
    // 字符串轉(zhuǎn)數(shù)組
    a = a.split("");
    b = b.split("");
    
    while (a.length || b.length || c){
        // ~~ 用來把String類型 轉(zhuǎn)為 Number類型
        // 把兩位相加的結(jié)果 和 進(jìn)位值相加
        c += ~~a.pop() + ~~b.pop();
        
        // 取余,把余數(shù)拼接到最終結(jié)果中
        res = c % 10 + res;
        
        // 保存進(jìn)位,true 或者 false
        c = c>9;
    }
    return res;
}
add("11111111111111111","22222222222222222");
解釋

1、~ 是JavaScript中的操作符,按位非,~~ 經(jīng)常用來進(jìn)行取整和類型轉(zhuǎn)換,他和顯示的用Number進(jìn)行類型轉(zhuǎn)換還是有區(qū)別的,比如處理 undefined 的時(shí)候。

而在兩個(gè)大整數(shù),長(zhǎng)度不一樣的時(shí)候,其中一個(gè)數(shù) 已經(jīng) pop 了所有數(shù)組中的元素之后,還要pop的話,就會(huì)返回 undefined ,所以如果用 Number 顯示的轉(zhuǎn)化,起碼要寫成這樣。

var ai = a.pop();
ai = ai===undefined? 0:Number(ai);

var bi = b.pop();
bi = bi===undefined? 0:Number(bi);

c += ai + bi;

明顯是用 ~~ 方便。

2、在保存進(jìn)位值的時(shí)候,用的并不是 1 和 0 ,而是true 和 false,這是因?yàn)殡[式類型轉(zhuǎn)換的時(shí)候,true會(huì)轉(zhuǎn)為1,false會(huì)轉(zhuǎn)為0。

總結(jié)

好的,最開始提到的問題已經(jīng)解決了,準(zhǔn)確的說,文中的代碼只是實(shí)現(xiàn)了 超出范圍的正整數(shù)相加,不支持負(fù)整數(shù)和小數(shù),也許我們可以繼續(xù)去做點(diǎn)什么。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107729.html

相關(guān)文章

  • JavaScript 精度丟失問題

    摘要:排除直接使用的數(shù)太大或太小超出范圍,出現(xiàn)這種問題的情況基本是浮點(diǎn)數(shù)的小數(shù)部分在轉(zhuǎn)成二進(jìn)制時(shí)丟失了精度,所以我們可以將小數(shù)部分也轉(zhuǎn)換成整數(shù)后再計(jì)算。 // 1. 兩數(shù)相加 // 0.1 + 0.2 = 0.30000000000000004 // 0.7 + 0.1 = 0.7999999999999999 // 0.2 + 0.4 = 0.6000000000000001 // 2.2...

    iOS122 評(píng)論0 收藏0
  • JS JavaScript實(shí)現(xiàn)楊輝三角

    摘要:實(shí)現(xiàn)楊輝三角觀察這樣的一組數(shù),找出規(guī)律,用控制臺(tái)輸出這樣規(guī)律的數(shù)規(guī)律這是楊輝三角,每一行頭尾的數(shù)都是,其余的數(shù)是上一行對(duì)應(yīng)的數(shù)字相加,考慮使用遞歸算法。答案參考第一個(gè)數(shù)為最后一個(gè)數(shù)為中間的數(shù)為前一行的兩個(gè)數(shù)相加用來放第行的數(shù)字符串形式輸出 JS JavaScript實(shí)現(xiàn)楊輝三角 1 1 1 1 2 1 1 3 3 1 1 4 6...

    yuanxin 評(píng)論0 收藏0
  • JS中如何理解浮點(diǎn)數(shù)?

    摘要:本文通過介紹的二進(jìn)制存儲(chǔ)標(biāo)準(zhǔn)來理解浮點(diǎn)數(shù)運(yùn)算精度問題,和理解對(duì)象的等屬性值是如何取值的,最后介紹了一些常用的浮點(diǎn)數(shù)精度運(yùn)算解決方案。浮點(diǎn)數(shù)精度運(yùn)算解決方案關(guān)于浮點(diǎn)數(shù)運(yùn)算精度丟失的問題,不同場(chǎng)景可以有不同的解決方案。 本文由云+社區(qū)發(fā)表 相信大家在平常的 JavaScript 開發(fā)中,都有遇到過浮點(diǎn)數(shù)運(yùn)算精度誤差的問題,比如 console.log(0.1+0.2===0.3)// fa...

    bang590 評(píng)論0 收藏0
  • leetcode從羅馬數(shù)字開始

    摘要:將羅馬數(shù)字轉(zhuǎn)化為十進(jìn)制數(shù)字上的一道簡(jiǎn)單級(jí)別的題目將羅馬數(shù)字轉(zhuǎn)化為對(duì)應(yīng)的十進(jìn)制數(shù)字,其中羅馬數(shù)字的范圍在這題的關(guān)鍵在于了解需求,及如何將羅馬數(shù)字轉(zhuǎn)化為對(duì)應(yīng)的十進(jìn)制數(shù)字羅馬數(shù)字轉(zhuǎn)化為十進(jìn)制數(shù)字的規(guī)則為用作數(shù)字的羅馬字母共有七個(gè),即相同的數(shù)字連寫 將羅馬數(shù)字轉(zhuǎn)化為十進(jìn)制數(shù)字 Leetcode上的一道簡(jiǎn)單級(jí)別的題目將羅馬數(shù)字轉(zhuǎn)化為對(duì)應(yīng)的十進(jìn)制數(shù)字,其中羅馬數(shù)字的范圍在1~3999 這題的關(guān)鍵在...

    LiveVideoStack 評(píng)論0 收藏0
  • js常見算法(二):從給定的無序、不重復(fù)的數(shù)組 A 中,取出 N 個(gè)數(shù),使其相加和 為 M

    摘要:背包問題從給定的無序不重復(fù)的數(shù)組中,取出個(gè)數(shù),使其相加和為這個(gè)算法有很多擴(kuò)展,比如電商中購物車中的計(jì)算,滿減,不滿會(huì)在熱銷商品中進(jìn)行推薦填充。 背包問題:從給定的無序、不重復(fù)的數(shù)組 A 中,取出 N 個(gè)數(shù),使其相加和 為 M 這個(gè)算法有很多擴(kuò)展,比如電商中購物車中的計(jì)算,滿100減20,不滿100會(huì)在熱銷商品中進(jìn)行推薦填充。 function getCombBySum(array,su...

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

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

0條評(píng)論

gself

|高級(jí)講師

TA的文章

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