一、場景描述
發現js把response中的資料轉成json格式之後,值不一樣了。
原因:在js中number型別統一按浮點型別處理,大整數的精度丟失和浮點數本質上是一樣的,尾數字最大是 52 位,因此 js 中能精準表示的最大整數是 math.pow(2, 53),十進位制即 9007199254740992,大於 9007199254740992 的可能會丟失精度。
解決:後台把long轉成string在返回給前段。
二、浮點數簡介
對於浮點型別的資料採用單精度型別(float)和雙精度型別(double),按照浮點數儲存標準(ieee 制定)來儲存,float資料占用32bit,double資料占用64bit。
單精度的儲存方式如下圖所示:
雙精度的儲存方式如下圖所示:
三、浮點數轉二進位制
例如:9.2轉二進位制
整數部分:9 ==> 1001
小數部分轉二進位制:小數乘以2,取整,小數部分繼續乘以2,取整,得到小數部分0為止,將整數順序排列.
比如0.2
0.2 * 2 = 0.4,取整0,小數部分0.4
0.4 * 2 = 0.8,取整0,小數部分0.8
0.8 * 2 = 1.6,取整1,小數部分0.6
0.6 * 2 = 1.2,取整1,小數部分0.2
….無限迴圈
即為0011*n
四、浮點數的二進位制儲存
舉個栗子:9.125
整數部分:9.125==>9==>1001
小數部分:
0.125 * 2 = 0.25 ==> 取整0,餘數0.25 ==>0
0.25 * 2 = 0.5 ==> 取整0,餘數0.5 ==>0
0.5*2 = 1.0 ==> 取整1 ==>1
拼接後9.125 ==> 1001.001==> 1.001001*2^3
1.001001 * 2^3 ==>
0 127 +3 0010 01 ==>
0 1000 0010 0010 01 ==> 0100 0001 0001 0010 0000000000000000
五、浮點數精度丟失
2.2轉換成二進位制為0 0111 1110 00110011001100110011 ….無窮,但是因為 float 和 double 儲存的位數都有限,那麼超出位數部分的肯定就被截斷了。
這就導致2.2最終被保留下來的可能就是:
0 (1位符號位) 0111 1110(8位指數字) 00110011001100110011…(23位位數)
在Mysql中建立自動增加的主鍵
1.建立資料庫 webases 2.使用資料庫 use webases 3.定義表 create table usertable userid int 4 primary key auto increment not null,uname varchar 20 not null,upassward ...
關於C builder中精度丟失的問題
原意 現有應交款項m元,折扣率n 0 n 1 折扣金額採取向下取整制,求折扣後金額lastmoney 公式 lastmoney m m 1 n 現設m 為 14.25元 折扣率n為0.8 根據公式計算 int norginmoney 1425 換成分為單位進行計算 double drebate 0....
js浮點數精度問題 js計算中遇到的坑
大多數語言在處理浮點數的時候都會遇到精度問題,但是在js裡似乎特別嚴重,來看乙個例子 alert 45.6 13 結果居然是592.800000000001,當然加法之類的也會有這個問題 那這是js的錯誤嗎?當然不是,你的電腦做著正確的二進位制浮點運算,但問題是你輸入的是十進位制的數,電腦以二進位制...