为什么用bigDecimal 不用double ?
double会出现精度丢失的问题,double执行的是二进制浮点运算,二进制有些情况下不能准确的表示一个小数,就像十进制不能准确的表示1/3(1/3=0.3333..),也就是说二进制表示小数的时候只能够表示能够用1/(2^n)的和的任意组合,但是0.1不能够精确表示,因为它不能够表示成为1/(2^n)的和的形式。
比如:
System.out.println(0.05 + 0.01);
java
System.out.println(1.0-0.42);
System.out.println(4.015 *100)
System.out.println(123.3 /100)
输出:
8.86800800000009005
0.58000000g000g01
401.49999999999994
1.2329999999999999
可以看到在Java中进行浮点数运算的时候,会出现丢失精度的问题。那么我们如果在进行商品价格计算的时候,就会出现问题。很有可能造成我们手中有0.06元,却无法购买一个0.05元和一个0.01元的商品。因为如上所示,他们两个的总和为0.060000000000000005。这无疑是一个很严重的问题,尤其是当电商网站的并发量上去的时候,出现的问题将是巨大的。可能会导致无法下单,或者对账出现问题。
而 Decimal 是精确计算,所以一般牵扯到金钱的计算,都使用 Decimal。
import java.math.BigDecimal;
aVa
public class BigDecimalExample {
public static void main(string[] args){BigDecimal num1 = new BigDecimal("0.1");BigDecimal num2 = new BigDecimal("0.2");
BigDecimal sum = num1.add(num2);
BigDecimalproductnum1.multiply(num2);
System.out.println("sum:"+ sum);
System.out.println("Product:" + product);
//输出
Sum: 0.3
Product:0.02
在上述代码中,我们创建了两个 Bigpecima1 对象 num1 和 num2 ,分别表示0.1和0.2这两个十进制数。然后,我们使用 add()方法计算它们的和,并使用 mu1tiply()方法计算它们的乘积。最后,我们通过System.out.println()打印结果,
这样的使用 Bigpecima1 可以确保精确的十进制数值计算,避免了使用 doub1e可能出现的舍入误差。需要注意的是,在创建 Bigpecima1 对象时,应该使用字符串作为参数,而不是直接使用浮点数值,以避免浮点数精度丢失。