自動主鍵在JS精度丟失中的坑

2021-09-02 21:05:14 字數 1651 閱讀 8739

一、場景描述

發現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的錯誤嗎?當然不是,你的電腦做著正確的二進位制浮點運算,但問題是你輸入的是十進位制的數,電腦以二進位制...