当前位置: 首页 > 知识库问答 >
问题:

BigDecimal添加函数显示值不正确

巫墨一
2023-03-14

我有以下代码:

AtomicReference<BigDecimal> totalAmount = new AtomicReference<>(new BigDecimal(BigInteger.ZERO, new MathContext(3)));
List<BigDecimal> list = new ArrayList<BigDecimal>();
list.add(new BigDecimal(8024));
list.add(new BigDecimal(8024));


list.forEach(value -> {


    totalAmount.set(totalAmount.get().add(value, new MathContext(3)));
});

基本上,当我运行上述代码时,总金额的总和应该是16048,但取而代之的是'1.60E 4。请告知我在这里错过了什么,以获得正确的金额?

共有2个答案

秦俊发
2023-03-14

BigDecimal及其add()方法将生成所需的结果。这里不需要使用lambda表达式。下面的代码演示了同样的情况。这也是干净的代码。

public static void main(String[] args) {
        
        List<BigDecimal> list = new ArrayList<BigDecimal>();
        
        list.add(new BigDecimal(8024));
        list.add(new BigDecimal(8024));
        
        BigDecimal total = BigDecimal.ZERO;
        
        for(BigDecimal element : list)
            total = total.add(element);
        
        System.out.print("Sum : " + total);
}

查看此代码在ideOne.com.运行

总数:16048

胡利
2023-03-14

您似乎遗漏了两件事:

  1. 对于值:在添加时使用new MathContext(3)会将值四舍五入为三位数。首先你加上8024,和,8024,四舍五入到8020。超过前三位数的所有内容都设置为0,向上或向下取整。然后你再加上8024,总和16044四舍五入到16000。
  2. 对于输出格式:当您打印一个BigDecimal时,您(隐式或显式地)调用它的toString方法。这种方法经常产生你得到的科学符号。确切的规则,当它在留档,请参阅底部的链接。如果您想确保控制您的BigDecimal的格式,请使用DecimalFormat
  3. 在这个例子中与您不需要的输出无关:当您在加法中首先执行get(),然后执行set()时,您正在误用原子引用。在多线程环境中(这是原子引用有任何意义的地方),不同的线程可能会在这两个调用之间执行set()或其他操作,但是当您执行set()<时,结果会丢失/code>。取而代之的是,您应该使用原子引用累加和获取(或getAnd累加)方法。

我也不明白你为什么用这么复杂的方式做事。这种简单的方法可以满足您的要求:

    List<BigDecimal> list = List.of(new BigDecimal("8024"), new BigDecimal("8024"));
    
    BigDecimal totalAmount = BigDecimal.ZERO;
    for (BigDecimal value : list) {
        totalAmount = totalAmount.add(value);
    }
    System.out.println(totalAmount);

输出为:

16048

它类似于另一个答案中的代码

编辑:作为一个好习惯,我将字符串文本传递给new BigDecimal()。虽然传递诸如8024这样的整数字面值本身没有问题,但传递双字面值(例如8024.1)通常意味着不准确。传递字符串将始终为您提供一个与字符串完全相同的值的BigDecimsl

文档链接

  • BigDecimal。toString()

 类似资料:
  • 我正在创建一个系统,使用GUI形式的链表存储数据。我在存储和显示链表时遇到了一些问题。看来我输入数据后,它并没有存储到链表中 我所做的是一个图书馆系统,所以我需要的是将书名、作者名、ISBN号和图书的拷贝数存储到链表中的单个节点中。这些信息来自用户输入,例如JTextField1。我的讲师教过我如何插入单个数据,但现在我需要插入多个数据。 我在Node类中重新创建了构造函数和getter方法,并在

  • 我希望有人能帮我解决以下问题。我正在创建一个Java桌面应用程序,其中有一个包含两个JPanel的JPanel topicPanel;TopicButton面板包含JButton createEntryButton和topicTabCardsPanel,后者实现CardLayout。单击createEntryButton时,我试图动态创建并添加一个新的JPanel entryPanel,其中包含J

  • 我尝试在云函数中使用Firestore,但遇到了错误 数据库。集合(…)。文档(…)。集合(…)。文档(…)。add不是promise的功能 我先读了这些主题,然后又读了其他主题。但我没有帮我。包裹。json外观 云功能之一 此代码来自函数 我怎样才能修复它?

  • 有人能告诉我代码有什么问题吗?它只显示第一行和表头information.thks

  • 我正在尝试使用一个名为'jQuery.InstagramFeed'的库,它允许我在不使用访问令牌的情况下显示用户feed中的图像。所以,我一直在尝试使用它,但是,出于某种原因,它并没有向我展示任何东西。 我已经研究了几个星期了,我已经尝试了在这里的很多帖子(以及其他论坛)中提出的很多解决方案,比如下面这些: TypeError:$不是函数调用jQuery函数 “未捕获的TypeError:$不是函