超過 js 的 number 型別最大值(9007 1992 5474 0992)的解決辦法

guile發表於2019-03-13

發現 bug:

點選修改無法展示資訊。修改時呼叫 findOne, 以 id(long) 為引數值,頁面傳的引數是 id=148004249825564000 ,在資料庫中這個 id=148004249825564012,id 出現了錯誤 。

 

根本原因:

js 的 number 型別的最大值是 9007 1992 5474 0992,2 的 53 次方,這個值是 16 位。

如果超過這個值,那麼 js 會出現不精確的現象。

 

解決方法:

1.後端傳遞字串型別。

JavaScript 權威指南 中說 js 數字 number 的最長長度是16位,如果數值類變數長度超過 16 位,可以採用 string 字串拼接的方法傳遞變數。

將後端傳遞引數的 long 型別轉為 string 型別,再傳到前端。

如果傳到前端傳的是集合,那麼集合裡每個物件都需要型別轉換。

2.在 userDao 中加入一個欄位

如果專案已經成型並且修改資料庫會造成不可預料的問題那麼可以在 User 物件中再增加一個 String 型別 id 對映欄位,如下
    private Long userId;
    private String userIdStr;


    public String getUserIdStr() {
        return this.userId+"";
    }
    public void setUserIdStr(String userIdStr) {
        this.userIdStr = userIdStr;

    }

這個方法是比較靠譜的,確實可以正常的顯示資料,查詢單個物件 id 的值都是正確的。但修改使用者時無法獲取前端傳遞的userDao 中的 userIdStr 的值,因為上面的 getUserIdStr() 不能獲取 userIdStr 的值(如果id沒有值)。

3.控制使用者新建記錄時 id 的長度。最後覺得這個方法最方便。

 

提示:以後設計表欄位時儘量用 varchar 型別。

 

原帖地址:  https://blog.csdn.net/sunmerZeal/article/details/80844843

相關文章