BigDecimal概述
BigInteger是Number的子类。它用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。
常用的构造方法:
BigDecimal(BigInteger val)
将 BigInteger转换成 BigDecimal 。
BigDecimal(double val)
将 double转换为 BigDecimal ,这是 double的二进制浮点值的精确十进制表示。
BigDecimal(String val)
将BigDecimal的字符串表示 BigDecimal转换为 BigDecimal 。
高频方法
BigDecimal abs()
返回一个 BigDecimal ,其值为此 BigDecimal的绝对值,其缩放比例为 this.scale() 。
int compareTo(BigDecimal val)
将此 BigDecimal与指定的BigDecimal进行 BigDecimal 。
BigDecimal add(BigDecimal augend)
返回 BigDecimal ,其值是 (this + augend) ,其标为 max(this.scale(), augend.scale()) 。
BigDecimal subtract(BigDecimal subtrahend)
返回 BigDecimal ,其值是 (this - subtrahend) ,其标为 max(this.scale(), subtrahend.scale()) 。
BigDecimal multiply(BigDecimal multiplicand)
返回 BigDecimal ,其值是 (this × multiplicand),其标为 (this.scale() + multiplicand.scale()) 。
BigDecimal divide(BigDecimal divisor)
返回BigDecimal ,其值为(this / divisor) ,优先级为(this.scale() - divisor.scale()) ; 如果不能表示确切的商(因为它具有非终止的十进制扩展),则抛出一个ArithmeticException 。
BigDecimal remainder(BigDecimal divisor)
返回 BigDecimal ,其值是 (this % divisor) 。
例子:仿照银行账户,避免精度误差
Account.java
import java.math.BigDecimal;
public class Account {
private long id;
private String name;
private String password;
private String persenId;
private String email;
private BigDecimal balance;
public Account() {
}
public Account(long id,String name,String persenId,String email,BigDecimal balance) {
this.id = id;
this.name = name;
this.persenId = persenId;
this.email = email;
this.balance = balance;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPersenId() {
return persenId;
}
public void setPersenId(String persenId) {
this.persenId = persenId;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public BigDecimal getBalance() {
return balance;
}
public void setBalance(BigDecimal balance) {
this.balance = balance;
}
@Override
public String toString() {
return "Account [id=" + id + ", name=" + name + ", password=" + password + ", persenId=" + persenId + ", email="
+ email + ", balance=" + balance + "]";
}
public void deposit(BigDecimal money) {
if(money.compareTo(new BigDecimal(0)) > 0) {
balance =balance.add(money);
System.out.println("存入"+money+"元");
}else {
System.out.println("存款有误");
}
showAccounnt();
}
public void withdraw(BigDecimal money) {
if(balance.compareTo(money) > 0) {
balance =balance.subtract(money);
System.out.println("取出"+money+"元");
}else {
System.out.println("余额不足"+money+"元,不可取");
}
showAccounnt();
}
public void showAccounnt() {
System.out.println("用户"+ name+"余额为"+balance+"元");
System.out.println("---------");
}
}
主类测试类Demo.java
import java.math.BigDecimal;
public class Account {
private long id;
private String name;
private String password;
private String persenId;
private String email;
private BigDecimal balance;
public Account() {
}
public Account(long id,String name,String persenId,String email,BigDecimal balance) {
this.id = id;
this.name = name;
this.persenId = persenId;
this.email = email;
this.balance = balance;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPersenId() {
return persenId;
}
public void setPersenId(String persenId) {
this.persenId = persenId;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public BigDecimal getBalance() {
return balance;
}
public void setBalance(BigDecimal balance) {
this.balance = balance;
}
@Override
public String toString() {
return "Account [id=" + id + ", name=" + name + ", password=" + password + ", persenId=" + persenId + ", email="
+ email + ", balance=" + balance + "]";
}
public void deposit(BigDecimal money) {
if(money.compareTo(new BigDecimal(0)) > 0) {
balance =balance.add(money);
System.out.println("存入"+money+"元");
}else {
System.out.println("存款有误");
}
showAccounnt();
}
public void withdraw(BigDecimal money) {
if(balance.compareTo(money) > 0) {
balance =balance.subtract(money);
System.out.println("取出"+money+"元");
}else {
System.out.println("余额不足"+money+"元,不可取");
}
showAccounnt();
}
public void showAccounnt() {
System.out.println("用户"+ name+"余额为"+balance+"元");
System.out.println("---------");
}
}
测试结果: