常用类库-java.math.BigDecimal
简介
类名:public class BigDecimal extends Number implements Comparable<BigDecimal>
有时在进行小数的运算时会出现计算结果精度丢失的问题,例如在控制台中打印 0.1+0.2 的计算结果时可见。当需要准确计算精度的数字时可以使用该类。需要注意的是该类是不可变的,即该类对象一经创建,它的值是不可变的。
构造方法
方法名:
public BigDecimal(char[] in)
public BigDecimal(String val)
public BigDecimal(double val)
public BigDecimal(int val)
作用:
以上四个方法作用均是把传入的参数转化为 BigDecimal 类型。
其中使用方法3需要特别注意,由于 double 类型的数据在构造时具有一定的不可预知性(不是所有的小数都能表示为有限长度的二进制数),这里直接使用此方法并不推荐,推荐直接使用方法2或先使用 Double.toString(Double d) 方法然后使用方法2。
使用案例:
package BigDecimalTest;
import java.math.BigDecimal;
/**
*@ClassName: BigDecimalTest
*@Description: BigDecimal的构造方法
*
*/
public class BigDecimalTest {
public static void main(String[] args) {
int a = 12;
double b = 1.2;// double类型的数据在构造时存在一定的不可预知性
String c = "1.3";
char[] d = {'1', '.', '4'};
BigDecimal num1 = new BigDecimal(a);
BigDecimal num2 = new BigDecimal(b);
BigDecimal num3 = new BigDecimal(c);
BigDecimal num4 = new BigDecimal(d);
System.out.println(num1);
// 这里1.2就无法表示为一个有限长度的二进制数,所以转换BigDecimal后并不是理想中的1.2
System.out.println(num2);
System.out.println(num3);
System.out.println(num4);
// 先将double类型转化为String类型,然后构造BigDecimal
System.out.println(new BigDecimal(Double.toString(b)));
}
}
常用方法:
add
方法名:public BigDecimal add(BigDecimal augend)
作用:
返回一个 BigDecimal 对象,它的值是 this + augend 。
使用案例:
package BigDecimalTest;
import java.math.BigDecimal;
/**
*@ClassName: AddTest
*@Description: BigDecimal中add的使用
*
*/
public class AddTest {
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("1.1");
BigDecimal num2 = new BigDecimal("1.2");
// 使用add方法后会返回一个BigDecimal,该对象的值才是计算结果,而不是方法调用的对象
BigDecimal num3 = num1.add(num2);
// 此处打印num1发现其值在调用add方法后并未发生改变
System.out.println(num1);
System.out.println(num3);
}
}
compareTo
方法名:public int compareTo(BigDecimal val)
作用:
将该对象与传入的参数 val 进行比较,this < val 则返回-1,this = val 则返回0,this > val 则返回1。
使用案例:
package BigDecimalTest;
import java.math.BigDecimal;
/**
*@ClassName: CompareToTest
*@Description: BigDecimal中compareTo的使用
*
*/
public class CompareToTest {
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("0.1");
BigDecimal num2 = new BigDecimal("0.2");
BigDecimal num3 = new BigDecimal("0.1");
System.out.print("num1.compareTo(num2):");
System.out.println(num1.compareTo(num2));
System.out.print("num1.compareTo(num3):");
System.out.println(num1.compareTo(num3));
System.out.print("num2.compareTo(num1):");
System.out.println(num2.compareTo(num1));
}
}
divide
方法名:public BigDecimal divide(BigDecimal divisor)
作用:
返回一个 BigDecimal 对象,它的值是 this / divisor 。
使用案例:
package BigDecimalTest;
import java.math.BigDecimal;
/**
*@ClassName: DivideTest
*@Description: BigDecimal中divide的使用
*
*/
public class DivideTest {
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("4.4");
BigDecimal num2 = new BigDecimal("2.2");
BigDecimal num3 = num1.divide(num2);
System.out.print("num1.divide(num2):");
System.out.println(num1.divide(num2));
}
}
multiply
方法名:public BigDecimal multiply(BigDecimal multiplicand)
作用:
返回一个 BigDecimal 对象,它的值是 this * multiplicand 。
使用案例:
package BigDecimalTest;
import java.math.BigDecimal;
/**
*@ClassName: MultiplyTest
*@Description: BigDecimal中multiply的使用
*
*/
public class MultiplyTest {
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("4.4");
BigDecimal num2 = new BigDecimal("2");
BigDecimal num3 = num1.multiply(num2);
System.out.print("num1.multiply(num2):");
System.out.println(num1.multiply(num2));
}
}
subtract
方法名:public BigDecimal subtract(BigDecimal subtrahend)
作用:
返回一个 BigDecimal 对象,它的值是 this - subtrahend 。
使用案例:
package BigDecimalTest;
import java.math.BigDecimal;
/**
*@ClassName: SubtractTest
*@Description: BigDecimal中subtract的使用
*
*/
public class SubtractTest {
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("4.4");
BigDecimal num2 = new BigDecimal("2");
BigDecimal num3 = num1.subtract(num2);
System.out.print("num1.subtract(num2):");
System.out.println(num1.subtract(num2));
}
}
max
方法名:public BigDecimal max(BigDecimal val)
作用:
返回一个 BigDecimal ,它的值是 this 和 val 中较大的那一个。
min
方法名:public BigDecimal min(BigDecimal val)
作用:
返回一个 BigDecimal ,它的值是 this 和 val 中较小的那一个。
使用案例:
package BigDecimalTest;
import java.math.BigDecimal;
/**
*@ClassName: MaxAndMinTest
*@Description: BigDecimal中max和min的使用
*
*/
public class MaxAndMinTest {
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("0.1");
BigDecimal num2 = new BigDecimal("0.2");
BigDecimal num3;
num3 = num1.max(num2);
System.out.print("num1.max(num2):");
System.out.println(num3);
System.out.print("num1.min(num2):");
num3 = num1.min(num2);
System.out.println(num3);
}
}
valueOf
方法名:public static BigDecimal valueOf(double val)
作用:
将一个 double 类型的数据转换成 BigDecimal 类型并返回,这是使用 double 数据构造 BigDecimal 的推荐使用方法。该方法的实现方式是先将 double 数据转换为 String 类型的字符串,然后使用构造方法通过 String 类型生成 BigDecimal 。以下是源码:
public static BigDecimal valueOf(double val) {
// Reminder: a zero double returns '0.0', so we cannot fastpath
// to use the constant ZERO. This might be important enough to
// justify a factory approach, a cache, or a few private
// constants, later.
return new BigDecimal(Double.toString(val));
}