BigDecimal - 4793572/fengchun GitHub Wiki

Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。 这个问题相当严重,如果你有9.999999999999元,你的计算机是不会认为你可以购买10元的商品的。 在有-的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有。现在让我们看看如何解决这个问题。 float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。BigDecimal一共有4个够造方法,我们不关心用BigInteger来够造的那两个,那么还有两个,它们是:

BigDecimal一共有4个构造方法 BigDecimal(int) 创建一个具有参数所指定整数值的对象。 BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 BigDecimal(long) 创建一个具有参数所指定长整数值的对象。 BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。 BigDecimal 的运算方式 不支持 + - * / 这类的运算 它有自己的运算方法 BigDecimal add(BigDecimal augend) 加法运算 BigDecimal subtract(BigDecimal subtrahend) 减法运算 BigDecimal multiply(BigDecimal multiplicand) 乘法运算 BigDecimal divide(BigDecimal divisor) 除法运算

现在我们已经可以解决这个问题了,原则是使用BigDecimal并且一定要用String来够造。

由于NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制。

BigDecimal bigLoanAmount = new BigDecimal("具体数值"); //创建BigDecimal对象 BigDecimal bigInterestRate = new BigDecimal("具体数值"); BigDecimal bigInterest = bigLoanAmount.multiply(bigInterestRate); //BigDecimal运算 NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用 NumberFormat percent = NumberFormat.getPercentInstance(); //建立百分比格式化用 percent.setMaximumFractionDigits(3); //百分比小数点最多3位 //利用BigDecimal对象作为参数在format()中调用货币和百分比格式化 System.out.println("Loan amount:\t" + currency.format(bigLoanAmount)); System.out.println("Interest rate:\t" + percent.format(bigInterestRate)); System.out.println("Interest:\t" + currency.format(bigInterest));