【问题】浏览器JS对超过17位字段精度失真问题

问题说明

浏览器Long长度大于17会精度丢失,解决办法是后台将Long转为String,原因是js number的局限。

问题剖析

【问题】浏览器JS对超过17位字段精度失真问题_第1张图片

JavaScript 的 Number 类型使用 64 位双精度浮点数(遵循 IEEE 754 标准),这种表示方式具有一定的精度限制。这种精度限制在处理大整数时尤为明显。例如,当一个 Long 值的位数超过 17 位时,可能会遇到精度丢失的问题。在这种情况下,通常建议在后台将 Long 转换为 String,以确保在传输和处理过程中不会丢失精度。

JavaScript 数值表示的局限性

  • IEEE 754 标准:
    JavaScript 的 Number 类型采用 IEEE 754 双精度浮点数格式来表示数字。这个格式有一个 52 位的有效数字位(即尾数),加上一个 11 位的指数位,以及一个符号位。
  • 精度限制:
    由于尾数部分只有 52 位有效位,因此 JavaScript 的 Number 类型可以精确表示的最大整数是 2 53 − 1 2^{53} - 1 2531(即 9,007,199,254,740,991)。当整数超出这个范围时,JavaScript 无法保持其精度,可能导致数值的精度丢失或不准确的结果。

问题验证

当你在浏览器中处理一个超过 17 位的 Long 整数时,可能会遇到精度丢失的问题:

let largeNumber = 1234567890123456789; // 超过 17 位的数字
console.log(largeNumber); // 输出可能会不准确

总结

在 JSON 数据交换中,JavaScript 无法安全地传输超过 17 位的整数。因此,使用字符串来传输这些整数是可靠的做法,因为字符串在传输过程中不会丢失精度。

解决办法

为了避免精度丢失,推荐在后台将 Long 类型转换为 String 类型,并在前端以字符串形式传递和处理这些大整数。这可以确保整数在传输和操作过程中不会丢失精度。

通用配置

@Configuration
public class WebConfiguration implements WebMvcConfigurer {
   

	@Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
   
        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();

      

你可能感兴趣的:(问题解决,问题记录,前端,javascript,开发语言,java,spring,boot)