整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          JavaScript 保留兩位小數

          JavaScript 保留兩位小數

          下我們將為大家介紹 JavaScript 保留兩位小數的實現方法:

          四舍五入

          以下處理結果會四舍五入:

          var num=2.446242342;
          num=num.toFixed(2); // 輸出結果為 2.45
          

          不四舍五入

          以下處理結果不會四舍五入:

          第一種,先把小數邊整數:

          Math.floor(15.7784514000 * 100) / 100 // 輸出結果為 15.77
          

          第二種,當作字符串,使用正則匹配:

          Number(15.7784514000.toString().match(/^\d+(?:\.\d{0,2})?/)) // 輸出結果為 15.77,不能用于整數如 10 必須寫為10.0000
          

          注意:如果是負數,請先轉換為正數再計算,最后轉回負數

          篇文章主要介紹了javascript實現保留兩位小數的多種不同效果,如果數字的原本小數位數不到兩位,那么缺少的就自動補零,非常適用于商城類網站,感興趣的小伙伴們可以參考一下。一般可以用作全局方法調用。

          (function (window) {

          // 將小數點清零

          var toInteger=function (value) {

          value=Math.round(parseFloat(value));

          return value;

          };

          // 保留一位小數點

          var toDecimal=function (value) {

          value=Math.round(parseFloat(value) * 10) / 10;

          if (value.toString().indexOf(".") < 0) {

          value=value.toString() + ".0";

          }

          return value;

          }

          // 保留兩位小數點

          var toFloat=function (value) {

          value=Math.round(parseFloat(value) * 100) / 100;

          if (value.toString().indexOf(".") < 0) {

          value=value.toString() + ".00";

          }

          return value;

          }

          // 保留兩位小數點,一位小數自動補零

          var toZero=function (value) {

          value=Math.round(parseFloat(value) * 100) / 100;

          var xsd=value.toString().split(".");

          //Ext.log(xsd.length);

          if (xsd.length==1) {

          value=value.toString() + ".00";

          return value;

          }

          if (xsd.length > 1) {

          if (xsd[1].length < 2) {

          value=value.toString() + "0";

          }

          return value;

          }

          }

          window.fomatFloat={

          toInteger: toInteger,

          toDecimal: toDecimal,

          toFloat: toFloat,

          toZero: toZero,

          };

          })(window);

          使用方式:

          console.log(fomatFloat.toInteger(1234.45678));

          console.log(fomatFloat.toDecimal(1234.45678));

          console.log(fomatFloat.toFloat(1234.45678));

          console.log(fomatFloat.toZero(1234.45678));

          console.log(fomatFloat.toZero(1234.1));

          console.log(fomatFloat.toZero(1234));

          運行結果:


          本文內容均屬個人原創(chuàng)作品,轉載此文章須附上出處及原文鏈接。

          加關注,定時推送,互動精彩多,若你有更好的見解,歡迎留言探討!

          責聲明:

          我已經盡量簡化了,由于觀看本節(jié)內容導致的頭暈、脫發(fā)、惡心、嘔吐等生理癥狀,本人概不負責

          在現實世界中,小數的書寫方式非常自然,只需要使用.即可代表之后的數字全是小數,例如3.1415926

          但是計算機存儲小數的時候,麻煩就來了。

          比如3.14,整數部分的二進制是11,小數部分的二進制是1011,合在一起就是111011,你能說這個數是3.14嗎?

          問題的根源就在它難以準確的表述小數點的位置。

          因此,必須另尋他法。

          浮點數基本概念

          聰明的人想出了一個巧妙的辦法

          在現實世界中,任何數字都可以表示為a.xxxx * 10^na.xxxx?10n,其中,a的取值范圍是1~9

          這叫做科學計數法

          比如:

          1024.5678=1.0245678 * 10^31024.5678=1.0245678?103,它表示,1.0245678的小數點向右移動3位,即最終的十進制小數

          952.7=9.527 * 10^2952.7=9.527?102,它表示,9.527的小數點向右移動2位,即最終的十進制小數

          那二進制是否也可以這樣表示呢?

          當然可以,在二進制的世界中,任何數字(包括整數)都可以表示為a.xxxx * 2^na.xxxx?2n,a只能取1

          比如:

          110.101=1.10101 * 2^2110.101=1.10101?22,它表示,1.10101的小數點向右移動2位,即最終的二進制小數

          0010.00011=1.000011 * 2^10010.00011=1.000011?21,它表示,1.000011的小數點向右移動1位,即最終

          的二進制小數

          可以看出,二進制如果也使用科學計數法,以下東西都是固定的:

          底數2

          整數部分1

          而不固定的部分是:

          指數部分

          尾數部分(小數點后面的部分)

          因此,我們可以使用下面的方式來表示一個數字

          第一部分第二部分第三部分

          符號 階碼 尾數

          0為正,1為負 這部分表示指數部分 這部分表示小數點后面的部分

          這種表示數字的方法,叫做浮點數表示法

          比如,110.101=1.10101 * 2^2110.101=1.10101?22,改數字的符號是0,階碼是2,階碼的二進制格式是10,尾數是10101,因此,在計算機中可以用浮點數表示為:

          符號階碼尾數

          0 10 10101

          是不是很簡單。

          但這樣一來,容易導致CPU搞不清楚階碼和尾數是在哪里分割的,我們可以輕松的從表格中看出,但計算機哪有什么表格,它是存在一起的:01010101

          為了解決這個問題,階碼和尾數的長度就必須固定

          比如,階碼的長度規(guī)定為3,尾數的長度規(guī)定為4,加上一個符號位,剛好是8位,一個字節(jié)

          如果按照這種約定,計算機就可以輕松的取出第一個符號位,然后輕松的取出后三位階碼,繼續(xù)取出后四位的尾數

          符號(1)階碼(3)尾數(4)

          0 010 1010

          可以看到,這種情況下,尾數的最后一位被丟棄了,從10101變成了1010,因為它只能存儲4位。

          所以,使用浮點數存儲數字時,可能導致存儲的數字不精確

          以上,就是浮點數存儲數字的方式。

          數字到浮點數的轉換

          我們知道,二進制科學計數法是浮點數的基石,只要有了二進制的科學計數法,就可以變成浮點數的存儲了。

          然而,我們平時接觸更多的是十進制的小數

          現在的問題是:如何把十進制的小數轉換為浮點數的科學計數法?

          下面將一步一步進行分析

          二進制小數到十進制小數

          要理解十進制小數是如何轉換成二進制小數的,就必須要先理解相反的情況:二進制小數是如何轉換成十進制小數的。

          我們知道,任何一個十進制的小數(包括整數)都可以書寫為下面的格式:

          21.25=2 * 10^1 + 1 * 10^0 + 2 * 10^{-1} + 2 * 10^{-2}21.25=2?101+1?100+2?10?1+2?10?2

          二進制的小數也可以用同樣的規(guī)則,只不過把底數10換成底數2

          下面的示例就是把一個二進制小數11.01轉換成了十進制小數3.25:

          11.01_2=1 * 2^1 + 1 * 2^0 + 0 * 2^{-1} + 1 * 2^{-2}=3.25_{10}11.012=1?21+1?20+0?2?1+1?2?2=3.2510

          十進制小數到二進制小數

          知道了二進制小數轉十進制,反過來也是一樣的

          省略了具體的數學推導(數學好的朋友自行完成),我們按照下面的方式來轉換

          比如十進制數3.25

          首先轉換整數部分:

          3_{10}=11310=11

          整數部分的轉換在之前的章節(jié)已經說的很詳細了,不再重復

          然后轉換小數部分

          現有小數乘以2取整數部分

          0.25 0.5 0

          0.5 1 1

          0 不再處理 不再處理

          最終得到的二進制小數部分是01,即把每次取整部分從上到下依次羅列即可

          0.25_{10}=0.01_20.2510=0.012

          把最終的整數部分加入進去,就形成了

          3.25_{10}=11.01_{2}3.2510=11.012

          無法精確轉換

          有的時候,這種轉換是無法做到精確的

          比如0.3這個十進制數,轉換成二進制小數按照下面的過程進行

          現有小數乘以2取整數部分

          0.3 0.6 0

          0.6 1.2 1

          0.2 0.4 0

          0.4 0.8 0

          0.8 1.6 1

          0.6 1.2 1

          0.2 0.4 0

          0.4 0.8 0

          0.8 1.6 1

          0.6 1.2 1

          ... ... ...

          0.3_{10}=0.0 1001 1001 1001 1001 ...=0.0\overline{1001}0.310=0.01001100110011001...=0.01

          在轉換的過程中,可能導致十進制的現有小數永遠無法歸零,于是轉換成了一個無限的二進制小數。

          同時,計算機無法存儲一個無限的數據,因此,總有一些數據會被丟棄,這就造成了計算機存儲的小數部分可能是不精確的

          進一步,如果一個小數無法精確的存儲,那么他們之間的運算結果也是不精確的

          這就是計算機對小數的運算不精確的原因

          // js語言中運行5.3 - 5.2 // 得到0.09999999999999964

          轉換成二進制的科學計數

          現在,按照以上所述的規(guī)則,我們已經可以輕松的把一個十進制的數字轉換成二進制格式了

          然后,我們再在它的基礎上,把它變化為二進制的科學計數格式

          3.25_{10}=11.01_2=1.101 * 2^13.2510=11.012=1.101?21

          注意,1.101 * 2^11.101?21是二進制的科學計數表示,你并不能把它當成十進制的方式運算,如果你要將其轉換成十進制,應該:

          將1.101的小數點向右移動1位,得到11.01

          .01=1

          2^1 + 1

          2^0 + 0

          2^{-1} + 1

          2^{-2}=3.25$

          當我們拿到這個數的二進制科學計數后,就可以輕松的將其存儲下來了

          3.25=11.01=1.101 * 2^1=1.1010 * 2^13.25=11.01=1.101?21=1.1010?21的存儲

          因為尾數是4位,所以不足在后面補0

          符號(1)階碼(3)尾數(4)

          0 001 1010

          然而

          請允許我做一個悲傷的表情

          還有一種情況沒有考慮到...

          指數偏移量

          建議先讀完本節(jié)內容,然后再反復推理和思考

          我們來聊一聊還有什么情況沒有考慮到

          現在,我們有一個十進制的數字0.25,它轉換成二進制的格式應該是0.01,科學計數法表示的結果是1*2^{-2}1?2?2,即小數點應該向左移動2位

          現在的問題是,指數部分出現了負數!

          注意,不是數字是負數,是指數是負數

          問題在于,我難道對指數也要使用一個符號位來處理負數的情況嗎?

          實際上沒有必要,在計算機運算浮點數時,對于指數部分,更多的操作是比較,即比較兩個指數哪個大

          如果使用符號位的話,在比較時就必須考慮符號的問題,這樣會給比較帶來很多麻煩

          因此,IEEE 754規(guī)定,使用指數偏移量來處理這個問題

          IEEE 754是對浮點數存儲、運算的國際標準,絕大部分計算機語言的浮點數都遵循該標準

          它規(guī)定,如果一個浮點數的指數位數為ee,則它的指數偏移量為2^{e - 1} - 12e?1?1,不管存儲什么指數值,都需要加上這個偏移量后再進行存儲。

          比如,指數的位數是3,則指數的偏移量為2^{3-1} - 1=323?1?1=3,當存儲指數-2時,需要加上偏移量3再進行存儲,因此,指數-2實際上存儲的是1,即001

          再比如,當存儲指數2時,需要加上偏移量3再進行存儲,因此,指數2實際上存儲的是5,即101

          如果比較-2和2哪個大,就直接比較兩個二進制即可,001顯然比101要小,指數部分完全沒有符號位,這樣比較起來就輕松多了。

          當然,當需要還原它的真實指數時,只需要減去偏移量即可

          于是,有了這樣的規(guī)則后:

          0.25_{10}=0.01_2=1.0000 * 2^{-2}0.2510=0.012=1.0000?2?2

          符號(1)階碼(3)尾數(4)

          0 001 0000

          3.25_{10}=11.01_2=1.1010 * 2^13.2510=11.012=1.1010?21

          符號(1)階碼(3)尾數(4)

          0 100 1010

          由于有了偏移量的存在,浮點數的指數范圍就可以很輕松的算出來了

          最小能存儲的指數是000,減去偏移量后真實的指數是-3

          最大能存儲的指數是111,減去偏移量后真實的指數是4

          稍微的總結一下,就是:

          階碼為n位的浮點數,指數的真實范圍是-2^{n-1}+1?2n?1+1 到 2^{n-1}2n?1

          特殊值

          在浮點數的標準中,有下面兩個特殊值:

          NaN:Not a Number,表示不是一個數字,它通常來自一些錯誤的運算,比如

          3.14 * "你好"

          Infinity:正向的無窮大,相當于數學中的

          \infty

          -Infinity:負向的無窮大,相當于數學中的

          -\infty

          ?

          為了表示這三個值,IEEE 754標準規(guī)定,當使用一種特殊的數字存儲來表示:

          NaN

          符號(1)階碼(3)尾數(4)

          無所謂

          比如:

          符號(1)階碼(3)尾數(4)

          0 111 1010

          上面這個數字可不是1.1010*2^{4}1.1010?24,它是一個NaN

          無窮

          符號(1)階碼(3)尾數(4)

          0:正無窮,1:負無窮 111

          比如:

          符號(1)階碼(3)尾數(4)

          0 111 0000

          上面這個數字可不是1.0000*2^{4}1.0000?24,它是一個Infinity

          由于特殊值的存在,讓階碼的最大值用于表示特殊值,因此,正常的數字階碼是不能取到最大值的

          因此,正常數字的階碼取值范圍少了一個:-2^{n-1}+1?2n?1+1 到 2^{n-1} - 12n?1?1

          比如,3位的階碼,它能表示的正常指數范圍是-3到3

          單精度和雙精度

          很多計算機語言中都有單精度和雙精度的概念,它們的區(qū)別在于階碼和尾數的位數是不一樣的

          Java的float是單精度浮點數,double是雙精度浮點數

          JS的所有數字均為雙精度浮點數

          類型符號階碼尾數共計

          單精度 1位 8位 23位 32bit,4byte

          雙精度 1位 11位 52位 64bit,8byte

          總結

          由于浮點數這種特別的存儲方式,因此,不同的階碼和尾數的位數,決定了:

          階碼位數越多,可以取到的指數越大,因此可以表示的數字越大

          尾數位數越多,可以表示的數字位數越多,因此可以表示的更加精確


          主站蜘蛛池模板: 亚洲AV无码一区二区三区国产| 天天躁日日躁狠狠躁一区| 国产裸体歌舞一区二区| 国产一区二区精品久久岳√| 国产精品高清视亚洲一区二区| 无码人妻品一区二区三区精99| 无码毛片视频一区二区本码| 一区二区国产在线播放| 无码国产亚洲日韩国精品视频一区二区三区 | 中文字幕精品无码一区二区| 一区二区高清视频在线观看| 色欲AV蜜桃一区二区三| 在线一区二区三区| 亚洲国产一区明星换脸| 国产伦精品一区二区三区四区| 精品视频一区二区三区四区| 91视频一区二区三区| 日韩一区二区视频| 麻豆一区二区在我观看| 精品国产精品久久一区免费式| 亚洲精品日韩一区二区小说| 一区二区三区国模大胆| 一区二区三区伦理高清| 精品伦精品一区二区三区视频| 少妇精品久久久一区二区三区 | 爆乳无码AV一区二区三区| 视频一区二区中文字幕| 丰满岳乱妇一区二区三区| 国产免费播放一区二区| 中文字幕在线精品视频入口一区| AV无码精品一区二区三区宅噜噜| 亚洲av无码片区一区二区三区| 国产视频一区在线播放| 无码精品人妻一区二区三区影院 | 亚洲AV网一区二区三区| 精品女同一区二区三区免费播放 | 久久久久人妻一区精品果冻| 精品国产毛片一区二区无码| 日本不卡一区二区三区视频| 精品国产区一区二区三区在线观看| 国模精品视频一区二区三区|