Java中BigDecimal类的常用方法
1.简介
BigDecimal类位于java.math.BigDecimal包下。使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用。
对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。
2.BigDecimal类常用方法
2.1.BigDecimal(String val):构造方法,将String类型转换成BigDecimal类型数据。
2.2.BigDecimal(double val):构造方法,将double类型转换成BigDecimal类型数据。
2.3.BigDecimal(int val):构造方法,将int类型转换成BigDecimal类型数据。
2.4.BigDecimal add(BigDecimal value):加法,求两个BigDecimal类型数据的和。
2.5.BigDecimal subtract(BigDecimal value):减法,求两个BigDecimal类型数据的差。
2.6.BigDecimal multiply(BigDecimal value):乘法,求两个BigDecimal类型数据的积。
2.7.BigDecimal divide(BigDecimal divisor):除法,求两个BigDecimal类型数据的商。
2.8.BigDecimal remainder(BigDecimal divisor):求余数,求BigDecimal类型数据除以divisor的余数。
2.9.BigDecimal max(BigDecimal value):最大数,求两个BigDecimal类型数据的最大值。
2.10.BigDecimal min(BigDecimal value):最小数,求两个BigDecimal类型数据的最小值。
2.11.BigDecimal abs():绝对值,求BigDecimal类型数据的绝对值。
2.12.BigDecimal negate():相反数,求BigDecimal类型数据的相反数。
代码:
BigDecimal a=new BigDecimal ("4.5");
BigDecimal b=new BigDecimal ("1.5");
BigDecimal c=new BigDecimal ("-10.5");
BigDecimal add_result=a.add(b);
BigDecimal subtract_result=a.subtract(b);
BigDecimal multiply_result=a.multiply(b);
BigDecimal divide_result=a.divide(b);
BigDecimal remainder_result=a.remainder(b);
BigDecimal max_result=a.max(b);
BigDecimal min_result=a.min(b);
BigDecimal abs_result=c.abs();
BigDecimal negate_result=a.negate();
Log.d("TAG","4.5+1.5="+add_result);
Log.d("TAG","4.5-1.5="+subtract_result);
Log.d("TAG","4.5*1.5="+multiply_result);
Log.d("TAG","4.5/1.5="+divide_result);
Log.d("TAG","4.5/1.5余数="+remainder_result);
Log.d("TAG","4.5和1.5最大数="+max_result);
Log.d("TAG","4.5和1.5最小数="+min_result);
Log.d("TAG","-10.5的绝对值="+abs_result);
Log.d("TAG","4.5的相反数="+negate_result);
结果:
4.5+1.5=6.0
4.5-1.5=3.0
4.5*1.5=6.75
4.5/1.5=3
4.5/1.5余数=0.0
4.5和1.5最大数=4.5
4.5和1.5最小数=1.5
-10.5的绝对值=10.5
4.5的相反数=-4.5
这里有一点需要注意的是除法运算divide。
BigDecimal除法可能出现不能整除的情况,比如 4.5/1.3,这时会报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。
其实divide有三个参数的方法
BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
第一参数表示除数。
第二个参数表示小数点后保留位数。
第三个参数表示舍入模式。只有在作除法运算或四舍五入时才用到舍入模式。
舍入模式有下面这几种:
ROUND_CEILING //向正无穷方向舍入
ROUND_DOWN //向零方向舍入
ROUND_FLOOR //向负无穷方向舍入
ROUND_HALF_DOWN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位 数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55 保留一位小数结果为1.6
ROUND_UNNECESSARY //计算结果是精确的,不需要舍入模式
ROUND_UP //向远离0的方向舍入
代码:
BigDecimal a=new BigDecimal("4.5");
BigDecimal b=new BigDecimal("1.5");
BigDecimal c=new BigDecimal("2");
BigDecimal result1=a.divide(b,2,BigDecimal.ROUND_HALF_UP);
BigDecimal result2=a.divide(c,2,BigDecimal.ROUND_HALF_UP);
Log.d("TAG","4.5/1.5="+result1);
Log.d("TAG","4.5/2="+result2);
结果:
4.5/1.5=3.00
4.5/2=2.25
3.BigDecimal 小数点处理
需求:计算结果保留三位小数。
代码:
/**
* 方式1
* 0.000:三位小数 同理 0.00:两位小数 依次类推...
* */
double a=3.154215;
DecimalFormat myformat=new java.text.DecimalFormat("0.000");
String result1 = myformat.format(a);
Log.d("TAG",a+"保留三位小数:"+result1);
/**
* 方式2
* #.000:三位小数 同理 #.00:两位小数
* */
double b=3.256321;
DecimalFormat df=new DecimalFormat("#.000");
String result2=df.format(b);
Log.d("TAG",b+"保留三位小数:"+result2);
/**
* BigDecimal类操作保留几位小数
* */
double c=3.558525;
BigDecimal bigDecimal=new BigDecimal(c);
double result3=bigDecimal.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
Log.d("TAG",c+"保留三位小数并四舍五入:"+result3);
结果:
3.154215保留三位小数:3.154
3.256321保留三位小数:3.256
3.558525保留三位小数并四舍五入:3.559
4.总结:
(1)商业计算使用BigDecimal。
(2)尽量使用参数类型为String的构造函数。
(3) BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。
Java中BigDecimal类的常用方法的更多相关文章
- java中File类的常用方法总结
java中File类的常用方法 创建: createNewFile()在指定的路径创建一个空文件,成功返回true,如果已经存在就不创建,然后返回false. mkdir() 在指定的位置创建一个此抽 ...
- Java中BigDecimal类介绍及用法
Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteger 类是 ...
- java 中String类的常用方法总结,带你玩转String类。
String类: String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.String类对象创建后不能修改,StringBuffer & St ...
- java 中String类的常用方法总结,玩转String类
String类: String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.String类对象创建后不能修改,StringBuffer & St ...
- Java中TimeZone类的常用方法
一.TimeZone类的定义 TimeZone类是一个抽象类,主要包含了对于时区的各种操作,可以进行计算时间偏移量或夏令时等操作 二.TimeZone类的常用方法 1.getAvailableIDs( ...
- Java中BigDecimal类
由于在运算的时候,float类型和double很容易丢失精度,演示案例,所以,为了能精确地表示.计算浮点数,Java提供了BIgDecimal BigDecimal类的概述 不可变的.任意精度的有符号 ...
- Java中String类的常用方法
判断功能的方法 public boolean equals (Object anObject) :将此字符串与指定对象进行比较. public boolean equalsIgnoreCase (St ...
- Java中StringBuffer类的常用方法
StringBuffer:StringBuffer类型 描述:在实际应用中,经常回遇到对字符串进行动态修改.这时候,String类的功能受到限制,而StringBuffer类可以完成字符串的动态添加. ...
- java中Vector类的常用方法
Vector类是实现List接口,所以继承的方法就不在这里讲了 https://www.cnblogs.com/xiaostudy/p/9503199.html public void add(int ...
随机推荐
- RESTful设计中的常见疑问
最近写了几个有关RESTful的API相关内容,也谈谈对常见问题的自己的理解. 什么是RESTful 详情可以看http://www.ruanyifeng.com/blog/2011/09/restf ...
- API 网关 Kong
什么是 API 网关? 所谓网关,主要作用就是连接两个不同网络的设备,而今天所讲的 API 网关是指承接和分发客户端所有请求的网关层. 为什么需要网关层?最初是单体服务时,客户端发起的所有请求都可以直 ...
- 萌新带你开车上p站(终极番外)
本文由“合天智汇”公众号首发,作者:萌新 0x01前言 这关其实和pwn关系不大,主要考察的都是linux下一些函数的操作,考察linux的基本功.涉及到的知识点包括一些经典的函数原型.IO重定向.文 ...
- 搞懂:前端跨域问题JS解决跨域问题VUE代理解决跨域问题原理
什么是跨域 跨域:一个域下的文档或脚本试图去请求另一个域下的资源 广义的跨域包含一下内容: 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源请求(内部的引用,脚本script,图片img,fr ...
- 轻量级熔断降级框架 alibaba sentinel 应用
一.简介: wiki:https://github.com/alibaba/Sentinel/wiki 选择: ♥ 开源,成熟(功能完备.实际应用),活跃(功能维护及拓展) ♥ 更轻量:依赖资源少:a ...
- 9.4 Go 数据格式
9.4 Go 数据格式 1.1. msgpack格式 官方msgpack官网用一句话总结: It’s like JSON. but fast and small. 简单来讲,它的数据格式与json类似 ...
- ABAP基础1:概念
包(Package)也称作开发类,是为了将程序等对象根据功能划分,进行区分和管理而导入的概念 每一个开发对象,如程序.类,都要隶属一个包,包一般隶属于某一个模块 每个包拥有一个CTS号,CTS号用于系 ...
- python基本数据类型;字符串及其方法三:
###################判断类型################### ######################################################### ...
- Fabric进阶(三)—— 使用SDK动态增加组织
在fabric网络运行过程中动态追加新的组织是相当复杂的,网上的资料也十分匮乏,大多是基于first-network这样的简单示例,而且是使用启动cli容器的方法来增加组织,几乎没有针对实际应用的解决 ...
- Closures Basic
Closures Closures are one of the most powerful features of JavaScript. JavaScript allows for the nes ...