<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] >[success] # 類型的小知識 >[info] ## toString ~~~ 1.十進制的 Number 可以帶小數,小數點前后部分都可以省略,但是不能同時省略例如這些都是合法的: .01 12. 12.01 ~~~ * 那么下面的案例 ~~~ 1.這時候12. 會被當做省略了小數點后面部分的數字而看成一個整體,如果過直接連在一起寫'12.toString()' 就會報錯,但是如果將 12 和 '.toString()' 這兩個部分用空格進行分割'12 .toString()' 是會正常打印的, 或者'12.'為一個整體那么就是'12..toString()' 也是會打印正確的 2.這里分享一個有趣的文章,如果利用這個'js' 詞法的技巧做一個知道那個用戶復制了什么信息 'https://www.codesky.me/archives/be-careful-what-you-copy-invisibly-inserting-usernames-into-text-with-zero-width-characters.wind' 3.12.toString() // 這是一個錯誤用法 ~~~ * 對第二條進行說明 ![](https://img.kancloud.cn/d0/f9/d0f9e2cf8606ee9c66056d8e11ef9260_541x198.png) ~~~ 將內容轉換為二進制,利用零寬在頁面不顯示的原理,將其轉譯和解析 ~~~ ~~~ // 寬位字符加密 const binaryToZeroWidth = (binary) => binary .split('') .map((binaryNum) => { const num = parseInt(binaryNum, 10) if (num === 1) { return '?' } else if (num === 0) { return '?' } return '?' }) .join('') // 寬位字符解密 const zeroWidthToBinary = (string) => string .split('') .map((char) => { // zero-width no-break space if (char === '?') { // zero-width space return '1' } else if (char === '?') { // zero-width non-joiner return '0' } return ' ' // add single space }) .join('') ~~~ >[info] ## 數字類型 -- 精度問題 ~~~ 1.JavaScript 中的 Number 類型基的雙精度浮點數規則,這中規則就會有下面兩種問題: 1.1.小數計算精度丟失,比如 0.1+0.2 不等于 0.3 1.2.整數最大范圍整數是按最大54位來算最大(253?- 1,Number.MAX_SAFE_INTEGER,9007199254740991) 最小(-(253?- 1),Number.MIN_SAFE_INTEGER,-9007199254740991) 安全整數范圍的。只要超過這個范圍, 就會存在被舍去的精度問題。 2.JavaScript 中有 +0 和 -0,在加法類運算中它們沒有區別,但是除法的場合則需要特別留意區分, 如果除以-0得到的是負無窮大,因此除法為了區分 +0 和 -0 的方式,正是檢測 '1/x 是 Infinity 還是 -Infinity'。 3.對于出現精度問題原因,JavaScript 引擎會先將十進制數轉換為二進制,然后進行加法運算, 再將所得結果轉換為十進制。在進制轉換過程中如果小數位是無限的,就會出現誤差。 ~~~ >[danger] ##### 解決0.1+0.2 不等于0.3問題 ~~~ 1.比較方法是使用 JavaScript 提供的最小精度值,檢查等式左右兩邊差的絕對值是否小于最小精度 2.'Number.EPSILON':為浮點數計算設置一個誤差范圍。因為浮點數的計算是不精確的。 如果誤差小于Number.EPSILON,我們就可以認為得到了正確的結果 3.toPrecision:如果該參數是一個非整數值,將會向下舍入到最接近的整數 ~~~ ~~~ console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON); ~~~ * 或者 ~~~ // 一般選12就能解決掉大部分0001和0009問題,而且大部分情況下也夠用了 parseFloat((0.1 + 0.2).toPrecision(12)) // 0.3 ~~~ >[danger] ##### 小數四舍五入問題 ~~~ 1.在解決四舍五入的時候不要使用'toFixed' 2.使用Math.round 來解決先擴大在縮小 ~~~ [JavaScript 浮點數陷阱及解法 寫的超級好讀他](https://github.com/camsong/blog/issues/9) [關于為什么不要使用toFixed](https://www.meiwen.com.cn/subject/jrpznxtx.html) ~~~ function round(number, precision) { return Math.round(+number + 'e' + precision) / Math.pow(10, precision); //same as: //return Number(Math.round(+number + 'e' + precision) + 'e-' + precision); } ~~~ [mdn round里面的參考案例可以看一下](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/round) >[danger] ##### 元轉換分 ~~~ 1.現在輸入框用戶輸入是元傳遞給后臺要是分的表現形式,正常第一反應輸入的數乘100就好了,但是 問題來了32.3*100 在js 輸出的結果為'3229.9999999999995' 其實可以現在做限制在輸入的位置顯示小數點 后最多兩位。 這樣 可以用 32.3.toFixed(2).repalce(".","") ~~~ >[danger] ##### 實現十進制轉換二進制 ~~~ 1.十進制轉二進制規則 1.1.整數部分十進制轉化二進制 將十進制除以2(二進制滿二進一)并對商取整,直到結果是0為止 1.2.小數部分乘2取整 舉個例子?10.12?轉換?二進制?: 拆分'整數'部分10?小數部分0.5 10/2 = 5 rem = 0 5/2 = 2 rem = 1 2/2 = 1 rem = 0 1/2 = 0 rem = 1 得到0101 需要逆轉1010 即為10的二進制表現形式 拆分'小數'部分 0.12 * 2 = 0.24,取整0 0.24 * 2 = 0.48,取整0 0.48 * 2 = 0.96,取整0 0.96 * 2 = 1.92,取整1,取小數繼續乘 0.92 * 2 = 1.84,取整1,取小數繼續乘 0.84 * 2 = 1.68,取整1,取小數繼續乘 ....... 依次類推得到0001111010111000010100011110101110000101000111101小數部分 0.12的二進制表現形式,當然這里只是做了截取實際二進制結果比現在的還要長 2.都知道在做數字計算的時候計算機會將數字轉換成二進制,做運算后將二進制轉換回 十進制但因為計算機最多只能存 52 位,除了 0.5,其余在轉換過程中都會進行截斷,于 是就出現了精度缺失 3.在實際開發中可以用使用'toString'幫助實現數字進制轉換 const num = 10.12; console.log(num.toString(2)); ~~~ * 自己實現一個十進制轉換二進制代碼 ~~~ /** * 描述實現十進制轉換進制 * @param {Number} decNumber * @param {Number} max=49 表示小數二進制表現最長位數 * @returns {String} */ function decimalToBinary(decNumber, max = 49) { let maxdecimalLen = max; let [integer, decimals] = decNumber.toString().split('.'); const integerLs = []; const decimalsLs = []; integer = Number(decNumber); decimals = Number(`0.${decimals}`); let rem; let binaryString = ''; let decimalsFirst; let decimalsLast; // 整數部分 while (integer > 0) { // 先取余數 rem = Math.floor(integer % 2); integerLs.push(rem); integer = Math.floor(integer / 2); } // 小數部分算法 while (maxdecimalLen > 0) { [decimalsFirst, decimalsLast] = String(decimals * 2).split('.'); decimals = typeof decimalsLast === 'undefined' ? 0 : Number(`0.${decimalsLast}`); decimalsLs.push(decimalsFirst); if (decimals === 0) break; maxdecimalLen -= 1; } if (integerLs.length > 0)binaryString = integerLs.reverse().join(''); if (decimalsLs.length > 0)binaryString += `.${decimalsLs.join('')}`; return binaryString; } console.log(decimalToBinary(10.5, 49)); ~~~ * 更優雅的小數部分二進制處理 ~~~ function fractionToBinary(num) { if (!num) return "0"; let result = []; let count = 0; while (num && count < 13) { let temp = num * 2; let i = Math.floor(temp); result.push(i); // 取小數 舉個例子 1.26 -1 則小數部分為0.26 num = temp - i; count++; } return result.join(""); } ~~~ * 用正則去判斷 ~~~ // 把十進制格式的“整數”轉換為二進制格式的字符串 Number.prototype.decimal2binary = function decimal2binary() { // this->new Number(28) decimal->28 let decimal = +this; if (/\./.test(decimal)) { // 包含小數 throw new RangeError('處理的數字必須是整數'); } // 整數 let sk = new Stack; if (decimal === 0) return '0'; while (decimal > 0) { sk.enter(decimal % 2); decimal = Math.floor(decimal / 2); } return sk.value().reverse().join(''); }; let num = 28; console.log(num.toString(2)); console.log(num.decimal2binary()); ~~~ >[danger] ##### 二進制轉換十進制思路 ~~~ 1.二進制轉換十進制,以1010.0001111010111000010100011110101110000101000111101二進制為例 整數部分1010 先逆轉0101 計算公式 0*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 10 小數部分 0*1*2^-1 + 0*1*2^-2 +0*1*2^-3 +0*1*2^-1 + 1 * 2^-4 + 1* 2^-5 + 1*2^-6 + 1* 2^-7 最后小數和整數部分轉換整合后得到10.1171875 ,因為計算機52位導致原本10.12變成 精度缺失的現象 ~~~ [這里可以更直觀看到計算結果](https://babbage.cs.qc.cuny.edu/IEEE-754.old/Decimal.html) js 使用parseInt 進行轉換例如 `parseInt(0101,10)` 結果 `65` >[danger] ##### 結合理解 ~~~ 1.計算機底層都是按照二進制值來存儲數據的,十進制的小數轉換為二進制,會出現無限循環對于無限循環的情況, 會自動裁切掉多余的部分=>十進制的小數,在計算機底層存儲的時候,就已經失真0.1+0.2在進行運算的時候, 是按照二進制來進行計算,把計算的結果變為10進制,交給客戶端呈現瀏覽器呈現的數值是有長度限制的, 超過長度限制的也會截取掉從最后一位向前數,全是零的干掉,遇到0.30000000000000004零的就要保留了 ~~~ ![](https://img.kancloud.cn/5c/f7/5cf725560c9203bbb1851a5cacba419e_680x233.png) [JavaScript 符號位、指數位、尾數位](https://juejin.cn/post/6844903849866559501) >[danger] ##### 解決精度問題 ~~~ 1.將數字轉成整數「擴大系數」 // 獲取系數 const coefficient = function coefficient(num) { num = num + ''; let [, char = ''] = num.split('.'), len = char.length; return Math.pow(10, len); }; // 求和操作 const plus = function plus(num1, num2) { num1 = +num1; num2 = +num2; if (isNaN(num1) || isNaN(num2)) return NaN; let coeffic = Math.max(coefficient(num1), coefficient(num2)); return (num1 * coeffic + num2 * coeffic) / coeffic; }; 2.三方庫:Math.js 、decimal.js、big.js ... ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看