摘要:問題實現字符串類型的數字相加的一個方法。總結好的,最開始提到的問題已經解決了,準確的說,文中的代碼只是實現了超出范圍的正整數相加,不支持負整數和小數,也許我們可以繼續去做點什么。
問題
實現 字符串類型的數字 相加的一個方法。
比如:
輸入 "11111111111111111" ,"22222222222222222",
返回 "33333333333333333"
JavaScript 能表示的最大安全整數是 9007199254740991,可以用API Number.MAX_SAFE_INTEGER 看一下
超出范圍就會發生精度丟失,像這樣
至于更詳細的關于精度丟失的問題,推薦看這篇文章
該死的IEEE-754浮點數,說「約」就「約」,你的底線呢?以JS的名義來好好查查你
這個問題中的兩個數字,都是超出范圍的,所以就不能簡單的把兩個數字,轉為Number類型,進行相加。
需要取兩個數字的每一位,進行相加,大于10,就進1,把結果保存在一個字符串中。
代碼function add(a,b){ // 保存最終結果 var res=""; // 保存兩位相加的結果 和 進位值 var c=0; // 字符串轉數組 a = a.split(""); b = b.split(""); while (a.length || b.length || c){ // ~~ 用來把String類型 轉為 Number類型 // 把兩位相加的結果 和 進位值相加 c += ~~a.pop() + ~~b.pop(); // 取余,把余數拼接到最終結果中 res = c % 10 + res; // 保存進位,true 或者 false c = c>9; } return res; } add("11111111111111111","22222222222222222");解釋
1、~ 是JavaScript中的操作符,按位非,~~ 經常用來進行取整和類型轉換,他和顯示的用Number進行類型轉換還是有區別的,比如處理 undefined 的時候。
而在兩個大整數,長度不一樣的時候,其中一個數 已經 pop 了所有數組中的元素之后,還要pop的話,就會返回 undefined ,所以如果用 Number 顯示的轉化,起碼要寫成這樣。
var ai = a.pop(); ai = ai===undefined? 0:Number(ai); var bi = b.pop(); bi = bi===undefined? 0:Number(bi); c += ai + bi;
明顯是用 ~~ 方便。
2、在保存進位值的時候,用的并不是 1 和 0 ,而是true 和 false,這是因為隱式類型轉換的時候,true會轉為1,false會轉為0。
好的,最開始提到的問題已經解決了,準確的說,文中的代碼只是實現了 超出范圍的正整數相加,不支持負整數和小數,也許我們可以繼續去做點什么。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107729.html
摘要:排除直接使用的數太大或太小超出范圍,出現這種問題的情況基本是浮點數的小數部分在轉成二進制時丟失了精度,所以我們可以將小數部分也轉換成整數后再計算。 // 1. 兩數相加 // 0.1 + 0.2 = 0.30000000000000004 // 0.7 + 0.1 = 0.7999999999999999 // 0.2 + 0.4 = 0.6000000000000001 // 2.2...
摘要:實現楊輝三角觀察這樣的一組數,找出規律,用控制臺輸出這樣規律的數規律這是楊輝三角,每一行頭尾的數都是,其余的數是上一行對應的數字相加,考慮使用遞歸算法。答案參考第一個數為最后一個數為中間的數為前一行的兩個數相加用來放第行的數字符串形式輸出 JS JavaScript實現楊輝三角 1 1 1 1 2 1 1 3 3 1 1 4 6...
摘要:本文通過介紹的二進制存儲標準來理解浮點數運算精度問題,和理解對象的等屬性值是如何取值的,最后介紹了一些常用的浮點數精度運算解決方案。浮點數精度運算解決方案關于浮點數運算精度丟失的問題,不同場景可以有不同的解決方案。 本文由云+社區發表 相信大家在平常的 JavaScript 開發中,都有遇到過浮點數運算精度誤差的問題,比如 console.log(0.1+0.2===0.3)// fa...
摘要:將羅馬數字轉化為十進制數字上的一道簡單級別的題目將羅馬數字轉化為對應的十進制數字,其中羅馬數字的范圍在這題的關鍵在于了解需求,及如何將羅馬數字轉化為對應的十進制數字羅馬數字轉化為十進制數字的規則為用作數字的羅馬字母共有七個,即相同的數字連寫 將羅馬數字轉化為十進制數字 Leetcode上的一道簡單級別的題目將羅馬數字轉化為對應的十進制數字,其中羅馬數字的范圍在1~3999 這題的關鍵在...
摘要:背包問題從給定的無序不重復的數組中,取出個數,使其相加和為這個算法有很多擴展,比如電商中購物車中的計算,滿減,不滿會在熱銷商品中進行推薦填充。 背包問題:從給定的無序、不重復的數組 A 中,取出 N 個數,使其相加和 為 M 這個算法有很多擴展,比如電商中購物車中的計算,滿100減20,不滿100會在熱銷商品中進行推薦填充。 function getCombBySum(array,su...
閱讀 3448·2023-04-26 00:39
閱讀 4039·2021-09-22 10:02
閱讀 2532·2021-08-09 13:46
閱讀 1098·2019-08-29 18:40
閱讀 1444·2019-08-29 18:33
閱讀 773·2019-08-29 17:14
閱讀 1513·2019-08-29 12:40
閱讀 2970·2019-08-28 18:07