出处:cnblogs.com/panchanggui/p/10766607.html

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值怎么比较大小呢? 能用>或者

两个BigDecimal值比较使用compareTo方法, 比较结果有-1, 0, 1, 分别表示小于, 等于, 大于; 对于0, 可以使用BigDecimal.ZERO表示!

四舍五入

简化BigDecimal计算的小工具类

如果我们要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。

你能够忍受这么烦琐的过程吗?

网上提供的工具类Arith来简化操作。它提供以下静态方法,包括加减乘除和四舍五入:

public   static   double   add(double   v1,double   v2)   public   static   double   sub(double   v1,double   v2)   public   static   double   mul(double   v1,double   v2)   public   static   double   div(double   v1,double   v2)   public   static   double   div(double   v1,double   v2,int   scale)   public   static   double   round(double   v,int   scale)

定点数和浮点数的区别

在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。

货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。

SQL 中的 NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。

定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。

最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。

比如 123.45 用十进制科学计数法可以表达为 1.2345 × 102 ,其中 1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。

在MySQL中使用浮点数类型和定点数类型来表示小数。浮点数类型包括单精度浮点数(FLOAT型)和双精度浮点数(DOUBLE型)。定点数类型就是DECIMAL型。MySQL的浮点数类型和定点数类型如下表所示:

类型名称 字节数 负数的取值范围 非负数的取值范围
FLOAT 4 -3.402823466E+38~
-1.175494351E-38
0和1.175494351E-38~
3.402823466E+38
DOUBLE 8 -1.7976931348623157E+308~
-2.2250738585072014E-308
0和2.2250738585072014E-308~
1.7976931348623157E+308
DECIMAL(M,D)或DEC(M,D) M+2 同DOUBLE型 同DOUBLE型

从上表中可以看出,DECIMAL型的取值范围与DOUBLE相同。但是,DECIMAL的有效取值范围由M和D决定,而且DECIMAL型的字节数是M+2,也就是说,定点数的存储空间是根据其精度决定的。

MySQL

BigDecimal在进行入库时, 数据库选择decimal类型, 长度可以自定义, 如18; 小数点我们项目中用的是2, 保留2位小数. 此外还要注意的就是默认值, 一定写成0.00, 不要用默认的NULL, 否则在进行加减排序等操作时, 会带来转换的麻烦!

`balance` decimal(18,2) DEFAULT '0.00' COMMENT '账户余额',

MySQL DECIMAL数据类型用于在数据库中存储精确的数值。我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据。

要定义数据类型为DECIMAL的列,请使用以下语法:

column_name DECIMAL(P,D);

在上面的语法中:

  • P是表示有效数字数的精度。

    P范围为1〜65。

  • D是表示小数点后的位数。

    D的范围是0~30。

  • MySQL要求D小于或等于(<=)P。

DECIMAL(P,D)表示列可以存储D位小数的P位数。十进制列的实际范围取决于精度和刻度。

与INT数据类型一样,DECIMAL类型也具有UNSIGNED和ZEROFILL属性。如果使用UNSIGNED属性,则DECIMAL UNSIGNED的列将不接受负值。

如果使用ZEROFILL,MySQL将把显示值填充到0以显示由列定义指定的宽度。另外,如果我们对DECIMAL列使用ZERO FILL,MySQL将自动将UNSIGNED属性添加到列。

以下示例使用DECIMAL数据类型定义的一个叫作amount的列。

amount DECIMAL(6,2);

在此示例中,amount列最多可以存储6位数字,小数位数为2位; 因此,amount列的范围是从-9999.99到9999.99。

android float类型保留两位小数_你知道MySQL中Decimal类型和Float Double的区别吗?相关推荐

  1. jq设置保留两位小数_如何实现python中format函数保留指定位数的小数?

    我们经常说我国人口有13亿,这13亿数字是一个近似数.在我们无法精确准确得到一个数字时,会选择是它的近似数.近似数即经过四舍五入.进一法或者去尾法等方法得到的一个与原始数据相差不大的一个数.之前小编向 ...

  2. decimal类型对象里面定义什么类型_MySQL中Decimal类型和Float Double的区别(详解)

    MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型. 其区别在于,float,double等非标准类型,在DB中保存的是近似值,而Decimal则以字符串的形 ...

  3. Math常用方法,String转float并且保留两位小数,除法

    除法 public static double div(double v1, double v2, int scale) {if (scale < 0) {throw new IllegalAr ...

  4. java double 保留小数_java使double类型保留两位小数的方法

    java使double类型保留两位小数的方法 本文是百分网小编整理的主要介绍关于java使double类型保留两位小数的方法,有需要的朋友们一起看看吧!想了解更多相关信息请持续关注我们应届毕业生考试网 ...

  5. java float四舍五入保留两位小数_java基础入门-float四舍五入保留两位小数注意的地方...

    float四舍五入保留两位小数注意的地方 最近在codewars做了一道非常简单的题目,但是它却花了我20来分钟,虽然最后解决了,但是中间发觉对于java的基础实在不行,回去要好好补一下 不说这么多, ...

  6. Java中double类型保留两位小数

    java中对double类型的小数经常会有小数点后边保留一位小数或者保留两位小数的需求. javaAPi中提供了一个专门的类BigDecimal,用来对超过16位有效位的数进行精确的运算. 使用步骤: ...

  7. java double类型保留两位小数的几种方法

    java double类型保留两位小数的几种方法 返回double类型的(转换比较方便) ①能四舍五入 double d = 114.145; d = (double) Math.round(d * ...

  8. java怎么输出保留两位小数_剖析Java输出怎么保留两位小数

    Java中,当两个整数相除时,由于小数点以后的数字会被截断,运算结果将为整数,此时若希望得到运算结果为浮点数,必须将两整数其一或是两者都强制转换为浮点数,也就是Java输出怎么保留两位小数?接下来郑州 ...

  9. 用python计算矩形面积结果四舍五入保留两位小数_你还在计算器开平方?太low了吧,学霸考场都用这种方法开平方...

    一般情况下,我们生活中遇到一个需要开平方的数时,第一反应就是拿手机计算器计算,但考试时怎么做?不让带计算器,包括具有计算功能的手表都严禁携带.那这个时候怎么做呢?手算开平方就是一种随时适用的方法,无论 ...

最新文章

  1. java 传入参数_java参数怎么传递参数
  2. Spring 容器IOC解析及简单实现
  3. python pandas 合并数据
  4. oss多线程 上传_oss-android/ios-sdk 断点续传(多线程)
  5. IOS 预览pdf,word文档的集中方式
  6. Java基础小常识-final,抽象类,接口-(11)
  7. 银行资产配置的新变化
  8. 梅宫主:聊聊创业路上关于韭菜的事儿。。
  9. c语言课程设计管理系统的设计,c语言课程设计-学生管理信息系统设计.doc
  10. uboot 中Nand flash 常用操作命令解析
  11. go clean 命令介绍
  12. 养生秘诀呼吸吐纳真的可以养生嘛?
  13. python的下载与安装小牛学堂_Python学习_Day1
  14. 苹果新功能之Continuity Camera连续性摄像头,是拯救者还是革新者
  15. 七问个税改革:工薪阶层为何感觉税负重
  16. D-028 DDR3硬件电路设计
  17. 38、Power Query-背后的贤内助M语言
  18. html中 a链接的默认样式,超链接的默认样式
  19. Web设计网站软件推荐
  20. 基于SpringBoot+Mybatis的SaaS平台搭建

热门文章

  1. Android中的PopUpWindow
  2. no plugin found for prefix ‘tomcat 7‘ in the current project and in the plugin groups的解决方法
  3. iphone,pad等真机不被xcode识别,解决方法
  4. 手机锁屏js倒计时停止问题解决办法探索
  5. 【干货】数字经济百项场景.pdf(附下载链接)
  6. 【干货】2020十大消费新机遇.pdf(附下载链接)
  7. 【干货】从点击率预估的视角看腾讯社交广告算法大赛
  8. python 中主线程结束 子线程还在运行么_「干货」python线程笔记
  9. angularjs config_AngularJS依赖注入
  10. java servlet init方法_Java HttpServlet.init方法代码示例