`
ncs123
  • 浏览: 103363 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

自动主键在JS精度丢失中的坑

    博客分类:
  • J2SE
 
阅读更多

一、场景描述


 

    发现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

四、浮点数的二进制存储

        • 符号位:0表示正数,1表示负数.
        • 对于指数部分N,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127~128,所以可以对他进行置偏,根据浮点数的存储标注(IEEE),float 类型的指数起始数为127(二进制0111 1111),double类型的指数起始数为1023(二进制011 1111 1111),在此基础上加指数,得到的就是内存中的指数的表示形式.所以指数部分的存储采用移位存储,存储的数据为32位则元数据+127 ,64位则+1023
        • 尾数则直接填入,位数不够则补0,位数过多则0舍1入

    举个栗子: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位位数)

 

  • 大小: 34.8 KB
  • 大小: 44.4 KB
  • 大小: 73 KB
  • 大小: 73.6 KB
分享到:
评论

相关推荐

    oracle数据库主键自动生成

    在 Oracle 数据库中,主键自动生成是指在插入数据时自动生成唯一的主键值,从而简化数据录入和维护工作。下面将详细介绍 Oracle 数据库主键自动生成的实现方法和相关知识点。 序列(Sequence) 序列是一种数据库...

    hibernate中自动生成主键的办法

    在IT领域的数据库设计与开发中,主键的生成机制是一个至关重要的环节,它不仅关系到数据的唯一性,还直接影响到数据库的性能和安全性。Hibernate作为一款流行的Java持久层框架,提供了多种自动生成主键的方法,以...

    自动生成主键uuid.zip

    总结来说,"自动生成主键uuid.zip"中的内容可能涉及到如何在Java中使用UUID生成32位的无序和有序ID,这对于数据库主键或其他需要全局唯一标识的场景非常有用。通过理解UUID的生成机制和结合其他数据,开发者可以定制...

    oracle设置主键自动增长

    本文主要介绍如何在 Oracle 数据库中设置主键自动增长,并通过具体的示例来帮助理解整个流程。 #### 二、创建表与自增主键 ##### 1. 创建表 首先,我们需要创建一张表。这里以 `example` 表为例,该表包含四个...

    Js文件里创建自动增长主键

    比较有用的UUID,工具类,Js文件创建主键

    oracle主键自动增长

    本文详细介绍了如何在Oracle数据库中实现主键的自动增长功能,主要包括了序列和触发器的使用方法。通过这些技术,可以在不依赖于数据库本身的特性的情况下,灵活地实现主键的自增,从而满足各种应用场景的需求。

    持久化类主键生成策略+例子

    在Java的持久化框架中,如JPA(Java Persistence API)和Hibernate,主键生成策略是数据模型设计的重要部分。主键通常是表中唯一标识记录的一列或一组列,用于确保数据的完整性和唯一性。本篇文章将深入探讨JPA的4种...

    JPA中的联合主键

    在Java Persistence API (JPA) 中,联合主键(Composite Key)是指由两个或更多个字段共同组成的主键,这与单字段主键(Single Field Primary Key)相对。这种设计模式通常用于那些需要多个属性来唯一标识实体的情况...

    powerdesigner创建oracle_数据库表,设置表主键列为自动增长

    - 序列的创建脚本可能不会自动包含在表的创建脚本中,需要手动添加。 - 测试时,检查主键是否按照预设规则自动增长。 以上步骤详细介绍了如何使用PowerDesigner 12.5创建Oracle数据库表,并设置主键列的自动增长...

    Hibernate中主键生成策略

    在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...

    vs2005定义自动编号主键列

    本文将深入探讨如何在VS2005中定义自动编号主键列,以及这一特性在数据库管理中的作用和注意事项。 ### 自动编号主键列的概念 自动编号主键列(也称为自增列或标识列)是指在插入新记录时,系统会自动为该列生成一...

    Oracle数据库创建表tuser设置主键自动增长

    在Oracle数据库中,创建一张包含自动增长主键的表是一项常见的需求。本文将详细介绍如何在Oracle环境中创建一个名为`tuser`的表,并实现其主键自动增长的功能。此外,还将介绍如何通过序列(sequence)来管理这个自动...

    oracle触发器实现主键自动增长

    在Oracle数据库中,实现主键自动增长是一种常见的需求,尤其在设计高并发、大数据量的系统时,确保每个记录都有一个唯一且连续的标识符变得至关重要。本文将深入探讨如何利用Oracle触发器来实现这一功能,同时也会...

    数据库中表的主键设计原则收藏.doc

    此外,对于象订单这样的有主外键的表来说,如果订单的"主档表"主键是自动生成的,那么在保存一个订单时,会要求对主档表与明细表同进行事务保存。这过程中,变以复杂而且不可行。 第三,是否要采用 int 型作为主键...

    数据库主键的五种设计方法

    这种方法是由于自动编号存在一些问题,于是有些朋友就采用自己生成,同样是数字型的,只是把自动增长去掉了,采用在 Insert 时,读取 Max 值后加一。但是,这种方法也存在一些问题,如记录非常大的话,那么 Max() 也...

    数据库主键设计之思考

    在数据库设计中,主键的设计是非常重要的。主键的存在代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,本记录的修改与删除。当我们没有主键时,这些操作会变的非常麻烦。 ...

    MyBatis主键自动生成方法.pdf

    在MyBatis中,主键自动生成是一种常见且实用的功能,尤其在与支持自动增加主键的数据库(如MySQL)配合使用时。当我们在插入数据时,有时希望数据库能够自动为新记录生成唯一的主键值,而不是手动指定。MyBatis提供...

    mybatis自增主键文档

    在MyBatis中,处理自增主键是一个常见的需求,特别是在Oracle和MySQL这两个数据库中。Oracle通常使用Sequence来生成自增主键,而MySQL则直接通过表定义的自增属性来处理。以下将详细讲解这两种数据库在MyBatis中的...

    hibernate 无主键表映射

    在Java的持久化框架Hibernate中,无主键表映射是一种特殊情况,主要处理那些在数据库中没有明确单一主键的表。这种情况通常出现在那些通过多个字段共同唯一标识一条记录的复合主键(Composite Key)场景。本文将详细...

Global site tag (gtag.js) - Google Analytics