为什么用 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); System.out.println(1.0 - 0.42); System.out.println(4.015 * 100); System.out.println(123.3 / 100); 输出: 0.060000000000000005 0.5800000000000001 401.49999999999994 1.2329999999999999
可以看到在 Java 中进行浮点数运算的时候,会出现丢失精度的问题。那么我们如果在进行商品价格计算的时候,就会出现问题。很有可能造成我们手中有 0.06 元,却无法购买一个 0.05 元和一个 0.01 元的商品。因为如上所示,他们两个的总和为 0.060000000000000005。这无疑是一个很严重的问题,尤其是当电商网站的并发量上去的时候,出现的问题将是巨大的。可能会导致无法下单,或者对账出现问题。
而 Decimal 是精确计算 , 所以一般牵扯到金钱的计算 , 都使用 Decimal。
import java.math.BigDecimal; 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); BigDecimal product = num1.multiply(num2); System.out.println("Sum: " + sum); System.out.println("Product: " + product); } } //输出 Sum: 0.3 Product: 0.02
在上述代码中,我们创建了两个BigDecimal
对象num1
和num2
,分别表示 0.1 和 0.2 这两个十进制数。然后,我们使用add()
方法计算它们的和,并使用multiply()
方法计算它们的乘积。最后,我们通过System.out.println()
打印结果。
这样的使用<code>BigDecimal</code>可以确保精确的十进制数值计算,避免了使用<code>double</code>可能出现的舍入误差。需要注意的是,在创建<code>BigDecimal</code>对象时,应该使用字符串作为参数,而不是直接使用浮点数值,以避免浮点数精度丢失。
码云笔记 » 为什么用 bigDecimal 不用 double ?