国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot解決前端js處理大數(shù)字丟失精度問題Long轉(zhuǎn)String

這篇具有很好參考價值的文章主要介紹了SpringBoot解決前端js處理大數(shù)字丟失精度問題Long轉(zhuǎn)String。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、Jackson對Long類型的處理導致精度丟失的問題
表的某一個字段的類型是 BIGINT,對應的 Java 類的屬性的類型就是 Long。當這個字段的值由后端返回給前端網(wǎng)頁時,發(fā)現(xiàn)了精度丟失的問題。比如后端返回的值是 588085469986509185,到了前端是 588085469986509200,后面的幾位數(shù)變成了 0,精度丟失了

二、原因
JavaScript 中數(shù)字的精度是有限的,BIGINT 類型的的數(shù)字超出了 JavaScript 的處理范圍。JavaScript 遵循 IEEE 754 規(guī)范,采用雙精度存儲(double precision),占用 64 bit,各位的含義如下:

1位(s) 用來表示符號位
11位(e) 用來表示指數(shù)
52位(f) 表示尾數(shù)
尾數(shù)位最大是 52 位,因此 JS 中能精準表示的最大整數(shù)是 Math.pow(2, 53),十進制即 9007199254740992。而 BIGINT 類型的有效位數(shù)是63位(扣除一位符號位),其最大值為:Math.pow(2, 63)。任何大于 9007199254740992 的就可能會丟失精度

三、解決方法
解決辦法就是讓 JavaScript 把數(shù)字當成字符串進行處理。對 JavaScript 來說,不進行運算,數(shù)字和?字符串處理起來沒有什么區(qū)別,在 Springboot 中處理方法基本上有以下幾種:

3.1 配置參數(shù) write_numbers_as_strings
Jackson 有個配置參數(shù) WRITE_NUMBERS_AS_STRINGS,可以強制將所有數(shù)字全部轉(zhuǎn)成字符串輸出。其功能介紹為:Feature that forces all Java numbers to be written as JSON strings.

使用方法很簡單,只需要配置參數(shù)即可?

spring:
  jackson:
    generator:
      write_numbers_as_strings: true

這種方式的優(yōu)點是使用方便,不需要調(diào)整代碼;缺點是顆粒度太大,所有的數(shù)字都被轉(zhuǎn)成字符串輸出了,包括按照 timestamp 格式輸出的時間也是如此

3.2 給 Java 類的屬性單獨加注解

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

指定了 ToStringSerializer 進行序列化,將數(shù)字編碼成字符串格式。這種方式的優(yōu)點是顆粒度可以很精細;缺點同樣是太精細,如果需要調(diào)整的字段比較多會比較麻煩

3.3 自定義ObjectMapper
最后想到可以單獨根據(jù)類型進行設置,只對 Long 型數(shù)據(jù)進行處理,轉(zhuǎn)換成字符串,
而對其他類型的數(shù)字不做處理。Jackson 提供了這種支持。方法是對 ObjectMapper 進行定制。根據(jù) SpringBoot 的官方文檔,找到一種相對簡單的方法,只對 ObjectMapper 進行定制,而不是完全從頭定制,方法如下:

import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return jacksonObjectMapperBuilder -> {
            // long -> String
            jacksonObjectMapperBuilder.serializerByType(Long.TYPE, ToStringSerializer.instance);
            // Long -> String
            jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance);
        };
    }
}

如果是 Json 工具類,可以這么設置

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

public class JsonUtil {

    private static ObjectMapper mapper = new ObjectMapper();

    static {
        SimpleModule simpleModule = new SimpleModule();
        // long -> String
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        // Long -> String
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        mapper.registerModule(simpleModule);
    }    
}

四、補充
如果方法3配置JacksonConfig不起作用但方法2起作用,請檢查是否配置了MVC,MVC級別比配置JacksonConfig要高,請在WebMvcConfig里配置Long轉(zhuǎn)換String文章來源地址http://www.zghlxwxcb.cn/news/detail-832675.html

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
    /**
     * 配置轉(zhuǎn)換器
     * @return
     */
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setObjectMapper(getObjectMapper());
        return converter;
    }

    private ObjectMapper getObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();

        // 指定時區(qū)
        objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
        // 日期類型字符串處理
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

        // Java8日期處理
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        objectMapper.registerModule(javaTimeModule);

        //將Long序列成String
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
        return objectMapper;
    }
}

到了這里,關于SpringBoot解決前端js處理大數(shù)字丟失精度問題Long轉(zhuǎn)String的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 記錄--前端金額運算精度丟失問題及解決方案

    記錄--前端金額運算精度丟失問題及解決方案

    前端開發(fā)中難免會遇到價格和金額計算的需求,這類需求所要計算的數(shù)值大多數(shù)情況下是要求精確到小數(shù)點后的多少位。但是因為JS語言本身的缺陷,在處理浮點數(shù)的運算時會出現(xiàn)一些奇怪的問題,導致計算不精確。 本文嘗試從現(xiàn)象入手,分析造成這一問題原因,并總結(jié)和整

    2024年02月19日
    瀏覽(24)
  • 如何解決前端傳遞數(shù)據(jù)給后端時精度丟失問題

    如何解決前端傳遞數(shù)據(jù)給后端時精度丟失問題

    有時候我們在進行修改操作時,發(fā)現(xiàn)修改既不報錯也不生效。我們進行排查后發(fā)現(xiàn)服務器端將數(shù)據(jù)返回給前端時沒有出錯,但是前端js將數(shù)據(jù)進行處理時卻出錯了,因為id是Long類型的,而js在處理后端返回給前端的Long類型數(shù)據(jù)時只能處理前16位,后3位進行了四舍五入操作,例

    2024年02月09日
    瀏覽(166)
  • SpringBoot后端Long數(shù)據(jù)傳到前端js精度損失問題

    在對應的字段上添加注解,將 Long 轉(zhuǎn)為 String 后傳輸。 在 js 對應的結(jié)果接收上使用 BigInt 。

    2024年02月19日
    瀏覽(100)
  • Vue 數(shù)字相加、相減精度丟失處理。

    方法 一: 方法 二: 方法 三:擴大運算范圍:將浮點數(shù)轉(zhuǎn)化為整數(shù),相乘或相加后再除回去,可以避免小數(shù)位精度的影響。 最后就是使用第三方庫:例如 decimal.js、big.js 等第三方庫可以提供更高精度的浮點數(shù)運算。

    2024年02月16日
    瀏覽(85)
  • 前端處理后端傳來的Long型數(shù)據(jù)精度丟失的問題--對象轉(zhuǎn)換器Jackson0bjectMapper

    1、問題描述 前端提交參數(shù) 后端處理 前端js對long型數(shù)據(jù)進行處理時丟失精度(只能保證16位),導致提交的id和數(shù)據(jù)庫中的id不一致。 2、 問題實現(xiàn) 如何解決這個問題? 我們可以在服務端給頁面響應json數(shù)據(jù)時進行處理,將long型數(shù)據(jù)統(tǒng)一轉(zhuǎn)為String字符串 3、具體代碼實現(xiàn)–對象

    2024年02月16日
    瀏覽(365)
  • js精度丟失的問題

    1.js精度丟失的常見問題,從常見的浮點型進行計算,到位數(shù)很長的munber類型進行計算都會造成精度丟失的問題, 首先我們看一個問題: 那么js為什么會出現(xiàn)精度丟失的問題: 計算機的二進制實現(xiàn)和位數(shù)限制有些數(shù)無法有限表示。就像一些無理數(shù)不能有限表示,如 圓周率 3.1

    2024年02月14日
    瀏覽(27)
  • js浮點數(shù)四則運算精度丟失以及toFixed()精度丟失解決方法

    js浮點數(shù)四則運算精度丟失以及toFixed()精度丟失解決方法

    1、四則運算精度丟失: 2、toFixed() 四舍五入精度丟失: js采用64位浮點數(shù)表示法(幾乎所有現(xiàn)代編程語言所采用),這是一種二進制表示法。二進制浮點數(shù)表示法并不能精確表示類似 0.1 這樣簡單的數(shù)字。 這個問題不只在js中才會出現(xiàn),在任何使用二進制浮點數(shù)的編程語言中

    2024年02月05日
    瀏覽(26)
  • JS小數(shù)運算精度丟失的問題

    JS小數(shù)運算精度丟失的問題

    工作中會不會經(jīng)常會碰到一些數(shù)據(jù)指標的計算,比如百分比轉(zhuǎn)化,保留幾位小數(shù)等,就會出現(xiàn)計算不準確,數(shù)據(jù)精度丟失的情況。通過這篇分享借助第三方庫能夠輕松解決數(shù)據(jù)精度丟失的問題。 JS數(shù)字精度丟失的一些常見問題 為什么0.1 + 0.2 === 0.3是false呢? 先看下面這個比喻

    2024年02月08日
    瀏覽(39)
  • spring Boot處理返回給前端Long類型精度丟失

    項目中采用springcloud Alibaba技術(shù)開發(fā)分布式系統(tǒng),開發(fā)過程中采用雪花算法生成分布式Id,為Long類型,而Long類型返回給前端,會出現(xiàn)精度丟失問題。 接下來我們主要了解下,如何快速的處理精度丟失的問題 可以直接在返回實體屬性添加\\\"@JsonSerialize(using = ToStringSerializer.class)\\\"。

    2024年02月02日
    瀏覽(102)
  • 后端Long類型傳到前端精度丟失的問題

    后端Long類型傳到前端精度丟失的問題

    問題出現(xiàn):后端的Java Bean的id屬性是用的Long類型對應數(shù)據(jù)庫主鍵使用bigint類型,當使用JSON方式傳遞該數(shù)據(jù)給前端時,前端接收到的數(shù)據(jù)末尾會變成0。(發(fā)生的精度丟失問題) 問題原因:Java中的long能表示的范圍比js中number大,也就意味著部分數(shù)值在js中存不下(變成不準確的值

    2024年02月16日
    瀏覽(100)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包