您的位置:首页 > 编程语言 > Java开发

JAVA基础——BigDecimal基本用法

2020-08-29 13:28 232 查看

文章目录


我们都知道,float和double在计算过程中会存在误差,如何避免使用浮点数失去精度?这里可以使用Java的Java.math包中提供的API类——BigDecimal。
BigDecimal是一个类,BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。

如何创建BigDecimal对象

创建BigDecimal有以下两种方式:

import java.math.BigDecimal;//先导入java.math包
BigDecimal bigDecimal1 = new BigDecimal("1.234567");//要带双引号,里面的参数是字符串类型,不带双引号会损失精度。
BigDecimal bigDecimal2 = BigDecimal.valueOf(1.234567);//参数为double,不必带双引号。

除了上述的两种方式以外,对于特殊的0,1,10,还可以用一下方式创建:

BigDecimal bigDecimal3 = BigDecimal.ZERO;//0
BigDecimal bigDecimal4 = BigDecimal.ONE;//1
BigDecimal bigDecimal5 = BigDecimal.TEN;//10

加减乘除运算

public BigDecimal add(BigDecimal value);//加法
public BigDecimal subtract(BigDecimal value);//减法
public BigDecimal multiply(BigDecimal value);//乘法
public BigDecimal divide(BigDecimal value);//除法

加减乘除BigDecimal的加减乘除进行运算以后都是返回了一个新的BigDecimal而不是在原有的对象上增加。
以加法为例(其它运算方法和加法相同)

public class Test {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal("1.5");//b1=1.5
BigDecimal b2 = new BigDecimal("2.5");//b2=2.5
BigDecimal b3 = b1.add(b2);//b3=2.5+1.5=4.0
System.out.println("b1 = " + b1)//b1的值并没有发生改变,是返回了一个新的BigDecimal而不是在原有的对象上增加。
System.out.println("b3 = " + b3);
}
}

输出结果:

BigDecimal比较大小

BigDecimal使用compareTo来比较大小
根据此方法,值相等但具有不同标度的两个BigDecimal对象(如,5.0 和 5.00和5.0000)被认为是相等的。
compareTo的返回值不是boolean类型,而是int类型0,1,-1。
-1表示小于,0表示相等,1表示大于。
如:

public class Test {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal("5.0");
BigDecimal b2 = new BigDecimal("1.0");
BigDecimal b3 = new BigDecimal("5.000");
int a = b1.compareTo(b2);//5.0大于1.0,a=1
int b = b2.compareTo(b3);//1.0小于5.000,b=-1
int c = b1.compareTo(b3);//5.0和5.000虽然标度不同但是值相等,c=0
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("c="+c);
}
}

输出结果:

BigDecimal保留小数

BigDecimal中的setScale方法用来格式化小数。
setScale中的参数定义:
ROUND_CEILING
Rounding mode to round towards positive infinity.
向正无穷方向舍入

ROUND_DOWN
Rounding mode to round towards zero.
向零方向舍入

ROUND_FLOOR
Rounding mode to round towards negative infinity.
向负无穷方向舍入

ROUND_HALF_DOWN
Rounding mode to round towards “nearest neighbor” unless both neighbors are equidistant, in which case round down.
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5

ROUND_HALF_EVEN
Rounding mode to round towards the “nearest neighbor” unless both neighbors are equidistant, in which case, round towards the even neighbor.
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP ,如果是偶数,使用ROUND_HALF_DOWN

ROUND_HALF_UP
Rounding mode to round towards “nearest neighbor” unless both neighbors are equidistant, in which case round up.
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6

ROUND_UNNECESSARY
Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary.
计算结果是精确的,不需要舍入模式

ROUND_UP
Rounding mode to round away from zero.
向远离0的方向舍入

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: