MySQL中Decimal类型和Float Double的区别 & BigDecimal与Double使用场景

您所在的位置:网站首页 float和int的区别 MySQL中Decimal类型和Float Double的区别 & BigDecimal与Double使用场景

MySQL中Decimal类型和Float Double的区别 & BigDecimal与Double使用场景

2023-04-22 09:50| 来源: 网络整理| 查看: 265

 

MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型。

其区别在于,float,double等非标准类型,在DB中保存的是近似值,而Decimal则以字符串的形式保存数值。float,double类型是可以存浮点数(即小数类型),但是float有个坏处,当你给定的数据是整数的时候,那么它就以整数给你处理。这样我们在存取货币值的时候自然遇到问题,我的default值为:0.00而实际存储是0,同样我存取货币为12.00,实际存储是12。

幸好mysql提供了两个数据类型:decimal,这种数据类型可以轻松解决上面的问题:decimal类型被 MySQL 以同样的类型实现,这在 SQL92 标准中是允许的。他们用于保存对准确精度有重要要求的值,例如与金钱有关的数据。

数据定义

float(M,S) M为全长,S为小数点后长度。

 

数据库类型和Java类型之间的关系:              

    DBC Type                            Java Type     CHAR                                     String     VARCHAR                              String     LONGVARCHAR                    String     NUMERIC                        java.math.BigDecimal     DECIMAL                         java.math.BigDecimal     BIT                                        boolean    BOOLEAN                            boolean     TINYINT                                  byte     SMALLINT                              short     INTEGER                                int     BIGINT                                    long     REAL                                      float     FLOAT                                   double     DOUBLE                               double     BINARY                                 byte[]     VARBINARY                          byte[]     LONGVARBINARY                byte[]     DATE                                  java.sql.Date     TIME                                   java.sql.Time     TIMESTAMP                       java.sql.Timestamp     CLOB                                     Clob     BLOB                                     Blob     ARRAY                                  Array     DISTINCT                           mapping of underlying type     STRUCT                                Struct     REF                                        Ref  

 

项目中BigDecimal与Double使用场景 金额要用BigDecimal

金额计算不能用doube!!!!

金额计算必须用BigDecimal,下面对比一下用double 跟BigDecimal的区别。先看一个小例子:

请看题:

示例1

问, 结果是多少? 0.01?

No! 结果是0.009999999999999998!

为什么会这样呢? 因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, 使用中, 往往难以确定.

常见的问题是定义了一个浮点数, 经过一系列的计算, 它本来应该等于某个确定值, 但实际上并不是!

double相减会转换成二进制,因double有效位数为 16位这就会出现存储小数位数不够的情况,这种情况下就会出现误差,解决方法就是使用BigDecimal,它的有效长度足够长可存储小数位数。

因此可代替double来进行加减乘除, 金额必须是完全精确的计算, 故不能使用double或者float, 而应该采用java.math.BigDecimal.

加减乘除

两个BigDecimal值应该怎样进行加减乘除呢? +, -, *, / 这样写吗? 不!

请看示例:

加减乘除使用了英文的加减乘除, 即add, substract, multiply和divide

大小比较

两个BigDecimal值怎么比较大小呢? 能用>或者



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3