1. 程式人生 > 實用技巧 >前端解析Long型別資料出現溢位

前端解析Long型別資料出現溢位

問題描述

專案中,在儲存userId和instructioId這些欄位時,都是使用64為長整數Long型別(資料庫的bigint);

後端將資料從DB中查詢出來後,返回的userId和instructionId是Long型別,示例如下:

上面是前端在接收到的json資料(response原始資料),注意上面的id、instructionId、userId,這幾個欄位都是Long型別

但是前端在顯示的時候,發現顯示的資料是不匹配的,如下圖所示:

前端程式碼中沒有進行顯示的轉換,在接收到json資料後,解析後就有問題了,如下圖所示(preview,解析後的資料預覽)

問題原因

1.後端使用64位儲存長整數(long),最大支援9223372036854775807

2.前端的JavaScript使用53位來存放,最大支援9007199254740992,超過最大值的數,可能會出現問題(得到的溢位後的值);

解決方式

可以從後端或者前端兩方來處理(其中一方進行處理即可,或者兩方都處理),需要雙方約定好規則即可。

單從後端解決

這個問題無非就是數值移除了,那麼可以將數字轉換為字串返回給前端即可,前端解析時,因為是字串,自然不會出現溢位的問題;

一般專案中Long型別欄位的數量比較多,可以配置Jackson,將所有的數字在序列化時,都轉換為字串

spring:
  jackson:
    generator:
      write_numbers_as_strings: true

如果專案涉及的、可能溢位的Long欄位比較少時,直接指定哪些欄位序列化時轉為字串即可,如下所示:

@JsonSerialize(using=ToStringSerializer.class)
private Long userId;  

單從前端解決

後端返回給前端的Long資料,如果是隻做展示,那麼可以由後端處理後返回;

但是如果前端需要使用處理後的Long進行計算,那麼就不能直接轉為數字,否則仍舊會出現溢位的問題;

但是前端可以使用一些外掛(比如math.js)進行轉換,參考:https://www.html.cn/archives/7340

原文連結:https://www.cnblogs.com/-beyond/p/14220516.html