Java:BigDecimal的学习与使用
一、BigDecimal概述
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。
BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/ 等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
二、BigDecimal常用构造函数
BigDecimal(int)
创建一个具有参数所指定整数值的对象
BigDecimal(double)
创建一个具有参数所指定双精度值的对象
BigDecimal(long)
创建一个具有参数所指定长整数值的对象
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 常用方法
add(BigDecimal)
BigDecimal对象中的值相加,返回BigDecimal对象
subtract(BigDecimal)
BigDecimal对象中的值相减,返回BigDecimal对象
multiply(BigDecimal)
BigDecimal对象中的值相乘,返回BigDecimal对象
divide(BigDecimal)
BigDecimal对象中的值相除,返回BigDecimal对象
toString()
将BigDecimal对象中的值转换成字符串
doubleValue()
将BigDecimal对象中的值转换成双精度数
floatValue()
将BigDecimal对象中的值转换成单精度数
longValue()
将BigDecimal对象中的值转换成长整数
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)} <<i>op</i>> {@code 0)}, where* <<i>op</i>> 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的学习与使用相关推荐
- 【Java】Java零基础学习笔记
文章目录 前言 思维导图 前期准备 卸载JDK 安装JDK Hello,world 可能遇到情况 java程序运行机制 IDEA的安装 java基础部分 基础语法 运算符 包机制 javaDoc文档手 ...
- Java零基础学习全套视频笔记
Java零基础学习全套视频笔记 一.Java基础 1.注释 注释并不会被执行,是给我们写代码的人看的,防止项目结构代码太多忘记代码相关功能. 书写注释是一个非常好的习惯,平时写代码也一定要注意规范. ...
- Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter
Java IO流学习总结四:缓冲流-BufferedReader.BufferedWriter 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/det ...
- Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream
Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ ...
- Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...
- Java零基础学习难吗
java编程是入行互联网的小伙伴们大多数的选择,那么对于零基础的小伙伴来说Java零基础学习难吗?如果你是初学者,你可以很好的理解java编程语言.并不困难.如果你的学习能力比较高,那么你对Java的 ...
- Java培训深度学习都要学什么
java的知识点有很多,如果是有java基础的同学,进行深度学习是非常有必要的,比较职场技能更新迭代非常的快,那么java培训深度学习都要学什么呢?来看看下面的详细介绍. Java培训深度学习都要学什 ...
- 零基础参加java培训如何学习
零基础的同学想要学好java技术,一定要比有基础的学员更加努力才可以,因为java技术要学习的东西有很多,在Java培训学习的过程中也是要掌握一定的技巧和方法的,下面就为大家详细的介绍一下零基础参加j ...
- java/android 设计模式学习笔记(1)--- 单例模式
前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...
- 用 Java 训练深度学习模型,原来这么简单
作者 | DJL-Keerthan&Lanking 来源 | HelloGitHub 头图 | CSDN下载自东方IC 前言 很长时间以来,Java 都是一个很受企业欢迎的编程语言.得益于丰富 ...
最新文章
- mysql导出数据 程序_MySQL数据导出与导入程序代码
- python php array,python处理PHP数组文本文件实例
- all resources based on handshake
- 【论文解读】打破常规,逆残差模块超强改进,新一代移动端模型MobileNeXt来了!精度速度双超MobileNetV2...
- SpringBoot配置文件-yaml的用法
- iOS定时器-- NSTimer 和CADisplaylink
- FTP and Firewalls
- 微信第三方平台-授权流程经验分享
- [转载] 面试常见问题总结
- (一)区块链的共识算法:整体介绍 及 分叉 的通俗讲解
- sqlserver安装目录_SQL 2008R2安装教程
- Java后端开发实习记录
- 电力电子仿真软件Plecs数据类型
- C语言编程入门训练(一)
- 由于启用计算机,win10由于启动计算机时出现了页面文件配置问题的详细解决方案...
- 关于 NLP 中的 tokenize 总结
- gabor特征 gabor滤波器
- HTML 的js中手机号,身份证号等正则表达式表示
- AI challenger 2018图片分类比赛—农作物病害检测
- python异常处理机制例题_16.python异常处理
热门文章
- A Game of Thrones(41)
- 在Ubuntu虚拟机使用ffmpeg采集摄像头的yuv视频数据
- python360安全浏览器_使用python3.7 的pycharm selenium自动化测试中启动360浏览器、360极速浏览器的方法...
- 锂电池参数含义与选择
- Matplotlib的一些常规操作
- 为什么linux虚拟机文件78g,linux 磁盘空间被占满但找不到目标文件的问题处理 lsof命令...
- 《Love and Math》(1)
- 怎么查看linux自动校验时间,linux校验时间
- python自动华 (十八)
- 《数据驱动 | 装备制造创新集群智慧化转型》