精华内容
下载资源
问答
  • 不要使用double,使用高精度类型BigDecimal(可精确到20位),常用使用方法请参考: https://blog.csdn.net/qq_37465368/article/details/83279148 使用分为基本单位,如: 1元 : 100 分...

    不要使用÷

    不要使用double,使用高精度类型BigDecimal(可精确到20位),常用使用方法请参考:

    https://blog.csdn.net/qq_37465368/article/details/83279148

    使用分为基本单位,如:

    1元 : 100 分

    展开全文
  • java开发中,一般涉及到金钱计算的时候用什么数据类型?精度尽量高
  • 他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些类型之一时,精度和规模的能被(并且通常是)指定;例如: salary DECIMAL(9,2) 在这个例子中,9(precisi...

    一般用decimal,长度18,保存2位小数,具体看业务
    在java的开发中,货币在数据库中MySQL常用Decimal和Numric类型表示,这两种类型被MySQL实现为同样的类型。他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些类型之一时,精度和规模的能被(并且通常是)指定;例如:

    salary DECIMAL(9,2)

    在这个例子中,9(precision)代表将被用于存储值的总的小数位数,而2(scale)代表将被用于存储小数点后的位数。因此,在这种情况下,能被存储在salary列中的值的范围是从-9999999.99到9999999.99。

           DECIMAL和NUMERIC值作为字符串存储,而不是作为二进制浮点数,以便保存那些值的小数精度。一个字符用于值的每一位、小数点(如果scale>0)和“-”符号(对于负值)。如果scale是0,DECIMAL和NUMERIC值不包含小数点或小数部分。
    
           不使用float或者double的原因:因为float和double是以二进制存储的,所以有一定的误差。
    

    比如:在数据库中c1,c2,c3分别存储类型是float(10.2),decimal(10.2),float类型。
    插入数据:
    在这里插入图片描述
    INTO test (c1,c2,c3) VALUES (1234567.23,1234567.23,1234567.23)
    在这里插入图片描述

    展开全文
  • 一般用decimal,长度18,保存2位小数,具体看业务 转载:https://blog.csdn.net/tutu_flying_pig/article/details/82706956

    一般用decimal,长度18,保存2位小数,具体看业务

     

     

    转载:https://blog.csdn.net/tutu_flying_pig/article/details/82706956

    展开全文
  • 我们知道,如果要存储小数的话,MySQL中有double\float\decimal三种数据类型供我们挑选。当我们存储的小数代表金钱的时候,我们又该如何选择这些数据类型呢?单精度型浮点数(float)是一个占用4字节共32位的数据类型...

    我们知道,如果要存储小数的话,MySQL中有double\float\decimal三种数据类型供我们挑选。当我们存储的小数代表金钱的时候,我们又该如何选择这些数据类型呢?

    单精度型浮点数(float)是一个占用4字节共32位的数据类型,由符号位、指数位、尾数位组成,最高位(31位)为符号位,表示正负值,指数位则是23~30位,范围为-128~127,尾数位是0~22位,表示小数部分,尾数位有23位,2^23 = 8388608,一共7位,这意味着最多能有7位有效数字,但能保证的为6位,也即float的精度为6~7位有效数字。float数值范围为-3.4E38~3.4E38。

    双精度型浮点数(double)是一个占用8字节64位的数据类型,由符号位、指数位、尾数位组成,最高位(63位)为符号位,表示正负值,指数位则是51~62位,范围为-1024~1023,尾数位是0~50位,表示小数部分。尾数位有52位,2^52 = 4503599627370496,一共16位,double的精度为15~16位有效数字,这意味着最多能有16位有效数字,但能保证的为15位。double数值范围-1.7E308~1.7E308。

    decimal从MySQL 5.1引入,列的声明语法是DECIMAL(M,D),其中M表示有效数字数,范围为1〜65,默认值是10。D是表示小数点后的位数。D的范围是0~30,默认为零,且要求D<=M。例如,DECIMAL(6,2)表示最多可以存储6位数字,小数位数为2位,取值范围为从-9999.99到9999.99。

    float double定义金钱字段存在什么问题?

    首先,我们先来看看使用float数据类型存储金钱,假如我们有一张表,用来存储用户的余额,表定义如下:

    CREATE TABLE `f` (`f1` float(10,2) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf-8

    然后向这个表里插入131072.32的积分值,如下所示:

    mysql> insert into f value (131072.32);Query OK, 1 row affected (0.00 sec)mysql> select * from f;+-----------+| f1 |+-----------+| 131072.31 |+-----------+1 row in set (0.00 sec)

    接着我们查询到的值为131072.31,那么问题来了,用户的金额居然少了0.01分,虽然是0.01分钱,但是我们作为东家,必须做到保障用户一分钱也不能少。

    float double为什么存在精度丢失问题?

    那么为什么会出现精度问题呢?我们先来看下一直0.3的双精度数字是如何存储在计算机中的。任何字符存储在计算机中都是以二进制形式存储的。而浮点数转化为二进制的计算过程是:将小数乘以2,去除整数部分作为二进制表示,即整数部分大于1为1,小于1为0,然后继续将小数部分乘以2,直到小数部分为0。例如将一个0.3的小数转为二进制:

    0.3 * 2 = 0.6 ——————- 0

    0.6 * 2 = 1.2 ——————- 1

    0.2 * 2 = 0.4 ——————- 0

    0.4 * 2 = 0.8 ——————- 0

    0.8 * 2 = 1.6 ——————- 1

    0.6 * 2 = 1.2 ——————- 1

    …………

    我们可以发现在该计算中已经出现了循环,0.3用二进制表示为 0100 1100 1100 1100 .... 小数部分出现无限循环,计算机有限的空间无法存储这么多位,则只能舍弃后面的位数,通过有限的位数存储下来得到一个近似值。用有限的二进制位无法准确表示一个小数,这也是在编程语言中表示小数会出现误差的原因。

    而一个二进制的小数转化为十进制的过程是:从左到右,依次为每位乘以2^( - i ), i从左到右依次增长。我们再将一个0.3的二进制的数转为十进制:

    1001 1001 1001 1001

    0 * 2^-1 + 1 * 2^-2 + 0 * 2^-3 + 0 * 2^-4 + 0 * 2^-5 + ……

    = 0 * 0.5 + 1*0.25 + 0 + 0 * 1/16 + 0 * 1/32 + ……

    = 0 + 0.25 + 0 + ……

    =0.2999999999999998897....

    所以我们发现,一个浮点数只能保证近似值的精确。同样的问题,在double中也会出现。这是因为存储时如果是float和double,那么会尽可能以近似的值存储,以保证精度。

    哪些类型可以定义对精度有要求的字段

    而如果是decimal来存储,就能保证准确的精度了,因为decimal内部以字符形式存储小数,属于准确存储,保证数字精度不会丢失的。假如我们有一张表,用来存储用户的余额,表定义如下:

    CREATE TABLE `dc` (`dc1` decimal(10,2) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf-8

    然后向这个表里插入131072.32的积分值,如下所示:

    mysql> insert into dc value (131072.32);Query OK, 1 row affected (0.00 sec)mysql> select * from dc;+-----------+| dc1 |+-----------+| 131072.32 |+-----------+1 row in set (0.00 sec)

    我们可以发现精度得于保证,综上所述,建议大家使用decimal类型来定义金额类型的字段。

    除了decimal之外,我们还可以选择整型来表示金钱字段,例如1.01元用101分表示,整型的存储和计算就不会出现精度丢失问题了。

    end

    往期推荐

    展开全文
  • BigDecimal类型用来处理精度更高的数据涉及到和金钱有关的,要很精确,严格来说,要用BigDecimal这中类型对应数据库中的decimal类型 用BigDecimal类型,不能像int类型直接用符号(+,-,*,/)进行运算,...
  • 在实际的应用当中 如果涉及到金钱之类的数据类型,一直想寻找一个合适的java数据类型来处理这方面的事情 前几天开了java解惑一本书,里面对很多平时不在意的一些细节做了详细的解惑。针对“小数详细计算”的解惑: ...
  • mysql 数据类型

    2019-10-08 11:29:29
    一、 数字 1、整数  tinyint  int  bigint ... deciaml 最为精确,涉及  注意:unsigned create table person( id int auto_increment primary key, name char(10) not null...
  • JAVAand数据类型拓展

    2020-10-14 11:18:10
    数据类型涉及到的面试问题 浮点数拓展 float f = 0.1f;//0.1 double d = 1.0/10;//0.1 System.out.println(f==d);//false float d1 = 23131312312313f; float d2 = d1 + 1; System.out.println(d1==d2);//ture ...
  • 平时的类型转换我们可能不会去在意精度丢失等问题,但涉及,特别是涉及到金额等计算时,就不能不去管丢失精度的问题了。 下面是double数据类型的几种计算方式,不丢失精度 double转int类型丢失精度问题 /** * ...
  • 数据类型 数值 字节数 tinyint 1字节 smallint 2字节 mediumint 3字节 int 4字节 float 4字节 double 8字节 decimal 16字节 一般涉及钱的数据用decimal,decimal是字符串形式的浮点数,没有...
  • js数据类型转换

    2018-04-28 14:33:52
    在做前端页面的时候,有时候会涉及到页面中数据的处理(加减乘除),如果不把数字转换的玩溜,嘿嘿,涉及方面的计算,搞不好就贪污了。js中数字的转换1.整形数字int的转换parseInt("1234blue"); //...
  • 在学习过程中,大多数人在项目中涉及到金钱之类的数据时,在数据库中可能会使用到float或者double这两种数据类型,在java代码的pojo中可能也会使用double或者float这两种数据类型。。 但是对于使用这两种数据类型...
  • 因为财务会涉及的问题,要求精度较高,而SUN在基础SE类库当中为程序员准备了精确度更高的类型,只不过这种类型是一种引用数据类型,不属于基本数据类型,它是: java . math . BigDecimal。 java程序中SUN有一套...
  • 财务涉及的问题,要求精度较高,所以SUN在基础SE类库当中 为程序员准备了精确度更高的类型,只不过这种类型是一种引用数据类型 不属于基本数据类型,它是:java.math.BigDecimal *其实java程序中SUN公司**提供.....
  • 当年那些涉及计算机语言的人,为什么会考虑到数据类型呢?   比如,大家都需要住房子,也都希望房子越大越好。但显然,没有钱,考虑房子没有意义。于是就出现了各种各样的商品房,有别墅的、复式的、错层的、单间...
  • 关于浮点型数据类型: float 单精度【4个字节】 double 双精度 【8个字节,精度较高】 double的精度太低【相对来说的】,不适合做财务软件。 财务涉及的问题,....
  • Java double float 类型数据在作计算的时候,特别是算的时候,需要注意的。
  • 我们开发的项目有可能会涉及,那么应该用什么数据类型呢? 我们大多数人都会认为应该用double,那么是这样吗? 看下面的例子 为什么会这样呢? 因为float和double都是浮点数, 都有取值范围, 都有精度范围...
  • 1.学习和掌握用户定义数据类型的概念、创建及使用方法。 2.学习和掌握用户定义函数的概念、创建及使用方法。 创建一个数据库,执行shiyan15.sql脚本 一、创建和使用用户定义的函数(此部分内容涉及的数据表包括...
  • django-模型类字段类型

    2019-08-29 12:06:04
    模型类属性的命名限制 ...字符串数据类型 整数类型 小数数据类型 两者的精确度不同 FloatField的精确度没有DecimalField高 涉及到金钱方面,使用DecimalField 例如 日期类型-年月日 ...
  • 在用 Mysql 处理财务数据时,我认为应该遵循以下原则:使用 DECIMAL 数据类型存储金额 。因为浮点数精度是有限的,并且无法精确的表示一些数字。应用程序也应该使用 Decimal 函数库来进行金额的加减乘除的运算,比如...
  • 在用 Mysql 处理财务数据时,我认为应该遵循以下原则:使用 DECIMAL 数据类型存储金额 。因为浮点数精度是有限的,并且无法精确的表示一些数字。应用程序也应该使用 Decimal 函数库来进行金额的加减乘除的运算,比如...
  • 在用 Mysql 处理财务数据时,我认为应该遵循以下原则:使用 DECIMAL 数据类型存储金额 。因为浮点数精度是有限的,并且无法精确的表示一些数字。应用程序也应该使用 Decimal 函数库来进行金额的加减乘除的运算,比如...
  • 涉及有关金钱的时候,数据类型一般不用 Float 或 Double。原因如下: public static void main(String[] args) { double a1 = 0.2; double a2 = 0.3; double a3 = a2 - a1; System.out.println(a3);...
  • decimal类型怎么算字节数

    千次阅读 2021-01-31 17:11:54
    相比于float,double类型,decimal类型属于精确类型,不会丢失精度,所以只要涉及到金钱,财务相关的数据,对应的类型一定要选择decimal。 那么decimal类型怎么算字节数,怎么看支持的数字可以到几位小数和几位整数...
  • 四:MySQL 数据类型简介 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。 数值类型:****(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型**(FLOAT**、REAL和DOUBLE ...
  • 在用 Mysql 处理财务数据时,我认为应该遵循以下原则:使用 DECIMAL 数据类型存储金额 。因为浮点数精度是有限的,并且无法精确的表示一些数字。应用程序也应该使用 Decimal 函数库来进行金额的加减乘除的运算,比如...
  • 在用 Mysql 处理财务数据时,我认为应该遵循以下原则:使用 DECIMAL 数据类型存储金额 。因为浮点数精度是有限的,并且无法精确的表示一些数字。应用程序也应该使用 Decimal 函数库来进行金额的加减乘除的运算,比如...

空空如也

空空如也

1 2 3 4 5 6
收藏数 108
精华内容 43
关键字:

数据类型涉及钱