gpt4 book ai didi

java - BigDecimal setScale 方法的工作方式与我期望的完全相反

转载 作者:搜寻专家 更新时间:2023-11-01 03:39:04 26 4
gpt4 key购买 nike

考虑这段代码:

import java.math.BigDecimal;
import java.math.RoundingMode;

public class RoundingTests {

public static void main(String[] args) {
BigDecimal bd1 = new BigDecimal(265.345d);
BigDecimal bd2 = new BigDecimal(265.335d);

System.out.println("Setting scale 265.345: " + bd1.setScale(2, RoundingMode.HALF_EVEN));
System.out.println("Setting scale 265.335: " + bd2.setScale(2, RoundingMode.HALF_EVEN));
}
}

输出是:

Setting scale 265.345: 265.35
Setting scale 265.335: 265.33

这与我的预期完全相反。使用 RoundingMode.HALF_EVEN(也称为 Bankers rounding)我期望这两个值都变成值 265.34

请注意,我不是故意使用 BigDecimal.round 方法,因为它也不是我需要的。如果我添加此代码(并导入 java.math.MathContext):

System.out.println("Rounding 265.345: " + bd1.round(new MathContext(2, RoundingMode.HALF_EVEN)));
System.out.println("Rounding 265.335: " + bd2.round(new MathContext(2, RoundingMode.HALF_EVEN)));

那么输出是:

Rounding 265.345: 2.7E+2
Rounding 265.335: 2.7E+2

这是预料之中的,并且在 BigDecimal setScale and round 中也有解释。 ,但这意味着它对我的目的基本上没用。

有人可以在这里解释 setScale 的问题吗?

更新:所以这只是另一个浮点问题,没有简单的方法来修复它,而不是从一开始就使用 BigDecimals。

最佳答案

您可能希望更改代码以使用 BigDecimal.valueOf() 而不是 new BigDecimal()

代码

  Double dValue = 265.345d;
Double dValue2 = 265.335d;
BigDecimal value = BigDecimal.valueOf(dValue);
BigDecimal bd1 = new BigDecimal(265.345d);
BigDecimal bd2 = new BigDecimal(265.335d);
BigDecimal value2 = BigDecimal.valueOf(dValue2);
System.out.println("BigDecimal.valueOf(dValue);");
System.out.println(value.toPlainString());
System.out.println(String.valueOf(dValue));
value = value.setScale(2, BigDecimal.ROUND_HALF_EVEN);
System.out.println(value);
System.out.println("BigDecimal.valueOf(dValue2);");
System.out.println(value2.toPlainString());
System.out.println(String.valueOf(dValue2));
value2 = value2.setScale(2, BigDecimal.ROUND_HALF_EVEN);
System.out.println(value2);
System.out.println("BigDecimal bd1 = new BigDecimal(265.345d);");
System.out.println(bd1.setScale(2, BigDecimal.ROUND_HALF_EVEN));
System.out.println("BigDecimal bd2 = new BigDecimal(265.335d);");
System.out.println(bd2.setScale(2, BigDecimal.ROUND_HALF_EVEN));

输出:

BigDecimal.valueOf(dValue);
265.345
265.345
265.34
BigDecimal.valueOf(dValue2);
265.335
265.335
265.34
BigDecimal bd1 = new BigDecimal(265.345d);
265.35
BigDecimal value2 = BigDecimal.valueOf(dValue2);
265.33

关于java - BigDecimal setScale 方法的工作方式与我期望的完全相反,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19859502/

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