gpt4 book ai didi

java - 大数乘法

转载 作者:搜寻专家 更新时间:2023-11-01 01:33:28 25 4
gpt4 key购买 nike

我尝试将两个 BigDecimal 值与 multiply 方法相乘,如下所示,

BigDecimal dur = BigDecimal.valueOf(60/1.1);
BigDecimal bal = BigDecimal.valueOf(1.1);

BigDecimal ans = dur.multiply(bal);

System.out.println("Ans:"+ans);

我将 ans 排除为 60。但我明白了,

Ans:59.999999999999994

为什么会出现这种情况以及我们如何解决它。

最佳答案

问题是您有一个值不能用 double 表示,但也不能用 BigDecimal 表示,因此您必须应用合理的舍入以获得预期的解决方案。

double d = 60 / 1.1 * 1.1;
System.out.println("double without rounding: " + d);
System.out.printf("double With rounding %.2f%n", d);

BigDecimal bd = BigDecimal.valueOf(60).divide(BigDecimal.valueOf(1.1), 9, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(1.1));
System.out.println("BigDecimal without rounding: " + bd);
System.out.printf("BigDecimal with rounding %.2f%n", bd);
// or
bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("BigDecimal with rounding: " + bd);

打印

double without rounding: 60.0
double With rounding 60.00
BigDecimal without rounding: 59.9999999995
BigDecimal with rounding 60.00
BigDecimal with rounding: 60.00

注意:double 恰好对这些值进行了正确舍入并给出了正确答案。但是,选择不同的组合,它将是不正确的。例如54.545454545454545 * 1.1 => 60.00000000000001

关于java - 大数乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29899323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com