一、BigDecimal概述

​        Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。

​        BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/ 等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

二、BigDecimal常用构造函数

  1. BigDecimal(int)

    创建一个具有参数所指定整数值的对象

  2. BigDecimal(double)

    创建一个具有参数所指定双精度值的对象

  3. BigDecimal(long)

    创建一个具有参数所指定长整数值的对象

  4. BigDecimal(String)

    创建一个具有参数所指定以字符串表示的数值的对象

    @Testpublic void test03(){System.out.println(new BigDecimal(1));System.out.println(new BigDecimal(1.0d));System.out.println(new BigDecimal(1l));System.out.println(new BigDecimal("1"));System.out.println(new BigDecimal(1.01));System.out.println(new BigDecimal(1.01d));System.out.println(new BigDecimal(1.01f));System.out.println(new BigDecimal("1.01"));}

运行结果 :

1
1
1
1
1.0100000000000000088817841970012523233890533447265625
1.0100000000000000088817841970012523233890533447265625
1.0099999904632568359375
1.01

三、BigDecimal常用方法

3.1 常用方法

  1. add(BigDecimal)

    BigDecimal对象中的值相加,返回BigDecimal对象

  2. subtract(BigDecimal)

    BigDecimal对象中的值相减,返回BigDecimal对象

  3. multiply(BigDecimal)

    BigDecimal对象中的值相乘,返回BigDecimal对象

  4. divide(BigDecimal)

    BigDecimal对象中的值相除,返回BigDecimal对象

  5. toString()

    将BigDecimal对象中的值转换成字符串

  6. doubleValue()

    将BigDecimal对象中的值转换成双精度数

  7. floatValue()

    将BigDecimal对象中的值转换成单精度数

  8. longValue()

    将BigDecimal对象中的值转换成长整数

  9. intValue()

    将BigDecimal对象中的值转换成整数

3.2、BigDecimal大小比较

BigDecimal(long) 和BigDecimal(int),因为是整数,所以精度就是0,而对于BigDecimal(double) ,当我们使用new BigDecimal(1.01)创建一个BigDecimal 的时候,其实创建出来的值并不是正好等于1.01的,而BigDecimal(String),那么new BigDecimal("1.01")创建出来的数的精度已经是可以确定的,就是1.01,精度也就是2。

BigDecimal中equals方法比较value和scale(数值和精度),精度不一样,也返回false;

    /*** Compares this {@code BigDecimal} with the specified* {@code Object} for equality.  Unlike {@link* #compareTo(BigDecimal) compareTo}, this method considers two* {@code BigDecimal} objects equal only if they are equal in* value and scale (thus 2.0 is not equal to 2.00 when compared by* this method).** @param  x {@code Object} to which this {@code BigDecimal} is*         to be compared.* @return {@code true} if and only if the specified {@code Object} is a*         {@code BigDecimal} whose value and scale are equal to this*         {@code BigDecimal}'s.* @see    #compareTo(java.math.BigDecimal)* @see    #hashCode*/@Overridepublic boolean equals(Object x) {if (!(x instanceof BigDecimal))return false;BigDecimal xDec = (BigDecimal) x;if (x == this)return true;if (scale != xDec.scale)return false;long s = this.intCompact;long xs = xDec.intCompact;if (s != INFLATED) {if (xs == INFLATED)xs = compactValFor(xDec.intVal);return xs == s;} else if (xs != INFLATED)return xs == compactValFor(this.intVal);return this.inflated().equals(xDec.inflated());}

而compareTo方法比较数值相同但是精度不同的两个数(例如2.0和2.00)被认为是相等的两个数,返回0。另外对于a.compareTo(b)方法

a=b,返回0;
        a>b,返回1;

故建议对于BigDecimal,使用compareTo方法对BigDecimal比较大小。

    /*** Compares this {@code BigDecimal} with the specified* {@code BigDecimal}.  Two {@code BigDecimal} objects that are* equal in value but have a different scale (like 2.0 and 2.00)* are considered equal by this method.  This method is provided* in preference to individual methods for each of the six boolean* comparison operators ({@literal <}, ==,* {@literal >}, {@literal >=}, !=, {@literal <=}).  The* suggested idiom for performing these comparisons is:* {@code (x.compareTo(y)} &lt;<i>op</i>&gt; {@code 0)}, where* &lt;<i>op</i>&gt; is one of the six comparison operators.** @param  val {@code BigDecimal} to which this {@code BigDecimal} is*         to be compared.* @return -1, 0, or 1 as this {@code BigDecimal} is numerically*          less than, equal to, or greater than {@code val}.*/public int compareTo(BigDecimal val) {// Quick path for equal scale and non-inflated case.if (scale == val.scale) {long xs = intCompact;long ys = val.intCompact;if (xs != INFLATED && ys != INFLATED)return xs != ys ? ((xs > ys) ? 1 : -1) : 0;}int xsign = this.signum();int ysign = val.signum();if (xsign != ysign)return (xsign > ysign) ? 1 : -1;if (xsign == 0)return 0;int cmp = compareMagnitude(val);return (xsign > 0) ? cmp : -cmp;}

Java:BigDecimal的学习与使用相关推荐

  1. 【Java】Java零基础学习笔记

    文章目录 前言 思维导图 前期准备 卸载JDK 安装JDK Hello,world 可能遇到情况 java程序运行机制 IDEA的安装 java基础部分 基础语法 运算符 包机制 javaDoc文档手 ...

  2. Java零基础学习全套视频笔记

    Java零基础学习全套视频笔记 一.Java基础 1.注释 注释并不会被执行,是给我们写代码的人看的,防止项目结构代码太多忘记代码相关功能. 书写注释是一个非常好的习惯,平时写代码也一定要注意规范. ...

  3. Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter

    Java IO流学习总结四:缓冲流-BufferedReader.BufferedWriter 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/det ...

  4. Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream

    Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ ...

  5. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  6. Java零基础学习难吗

    java编程是入行互联网的小伙伴们大多数的选择,那么对于零基础的小伙伴来说Java零基础学习难吗?如果你是初学者,你可以很好的理解java编程语言.并不困难.如果你的学习能力比较高,那么你对Java的 ...

  7. Java培训深度学习都要学什么

    java的知识点有很多,如果是有java基础的同学,进行深度学习是非常有必要的,比较职场技能更新迭代非常的快,那么java培训深度学习都要学什么呢?来看看下面的详细介绍. Java培训深度学习都要学什 ...

  8. 零基础参加java培训如何学习

    零基础的同学想要学好java技术,一定要比有基础的学员更加努力才可以,因为java技术要学习的东西有很多,在Java培训学习的过程中也是要掌握一定的技巧和方法的,下面就为大家详细的介绍一下零基础参加j ...

  9. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  10. 用 Java 训练深度学习模型,原来这么简单

    作者 | DJL-Keerthan&Lanking 来源 | HelloGitHub 头图 | CSDN下载自东方IC 前言 很长时间以来,Java 都是一个很受企业欢迎的编程语言.得益于丰富 ...

最新文章

  1. mysql导出数据 程序_MySQL数据导出与导入程序代码
  2. python php array,python处理PHP数组文本文件实例
  3. all resources based on handshake
  4. 【论文解读】打破常规,逆残差模块超强改进,新一代移动端模型MobileNeXt来了!精度速度双超MobileNetV2...
  5. SpringBoot配置文件-yaml的用法
  6. iOS定时器-- NSTimer 和CADisplaylink
  7. FTP and Firewalls
  8. 微信第三方平台-授权流程经验分享
  9. [转载] 面试常见问题总结
  10. (一)区块链的共识算法:整体介绍 及 分叉 的通俗讲解
  11. sqlserver安装目录_SQL 2008R2安装教程
  12. Java后端开发实习记录
  13. 电力电子仿真软件Plecs数据类型
  14. C语言编程入门训练(一)
  15. 由于启用计算机,win10由于启动计算机时出现了页面文件配置问题的详细解决方案...
  16. 关于 NLP 中的 tokenize 总结
  17. gabor特征 gabor滤波器
  18. HTML 的js中手机号,身份证号等正则表达式表示
  19. AI challenger 2018图片分类比赛—农作物病害检测
  20. python异常处理机制例题_16.python异常处理

热门文章

  1. A Game of Thrones(41)
  2. 在Ubuntu虚拟机使用ffmpeg采集摄像头的yuv视频数据
  3. python360安全浏览器_使用python3.7 的pycharm selenium自动化测试中启动360浏览器、360极速浏览器的方法...
  4. 锂电池参数含义与选择
  5. Matplotlib的一些常规操作
  6. 为什么linux虚拟机文件78g,linux 磁盘空间被占满但找不到目标文件的问题处理 lsof命令...
  7. 《Love and Math》(1)
  8. 怎么查看linux自动校验时间,linux校验时间
  9. python自动华 (十八)
  10. 《数据驱动 | 装备制造创新集群智慧化转型》