为什么用 bigDecimal 不用 double ?

AI 概述
double 会出现精度丢失的问题,double 执行的是二进制浮点运算,二进制有些情况下不能准确的表示一个小数,就像十进制不能准确的表示 1/3(1/3=0.3333…),也就是说二进制表示小数的时候只能够表示能够用 1/(2^n)的和的任意组合,但是 0.1 不能够精确表示,因为它不能够表示成为 1/(2^n)的和的形式。 比如: System...

为什么用 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对象num1num2,分别表示 0.1 和 0.2 这两个十进制数。然后,我们使用add()方法计算它们的和,并使用multiply()方法计算它们的乘积。最后,我们通过System.out.println()打印结果。

这样的使用<code>BigDecimal</code>可以确保精确的十进制数值计算,避免了使用<code>double</code>可能出现的舍入误差。需要注意的是,在创建<code>BigDecimal</code>对象时,应该使用字符串作为参数,而不是直接使用浮点数值,以避免浮点数精度丢失。

以上关于为什么用 bigDecimal 不用 double ?的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

1

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 为什么用 bigDecimal 不用 double ?

发表回复