当前位置: 首页 > 面试题库 >

Java中使用BigDecimal的舍入模式

林德辉
2023-03-14
问题内容

以下代码使用RoundingMode.HALF_EVEN

BigDecimal value1 = new BigDecimal("4.5");
value1=value1.setScale(0, RoundingMode.HALF_EVEN);

BigDecimal value2 = new BigDecimal("6.5");
value2=value2.setScale(0, RoundingMode.HALF_EVEN);

System.out.println(value1+"\n"+value2);

分别显示46。在我看来,它应该分别显示5和,7因为丢弃的小数部分左边的数字(在这种情况下为5)是 奇数
。在这种情况下,RoundingMode.HALF_UP

并且在的情况下RoundingMode.HALF_UPRoundingMode.UP当丢弃的小数部分> =
0.5时执行(这是正确的),否则RoundingMode.DOWN执行。


问题答案:

该行为在Javadoc中有很好的描述:

舍入模式向“最近的邻居”舍入, 除非两个邻居都等距,在这种情况下,向偶数邻居舍入

因此,给定数字4.5,当您调用它时,它恰好位于4到5之间的数字范围的中间:

BigDecimal value1 = new BigDecimal("4.5").setScale(RoundingMode.ROUND_HALF_EVEN);

运行时也需要找出要舍入的邻居,也就是应该舍入到4或舍入到5?通常,它将基于哪个值4.5更接近,但在这种情况下,它接近 两个
邻居。与其随意选择最终结果,不如选择偶数。这是的行为ROUND_HALF_EVEN。如果需要,您可以指定ROUND_HALF_UP最终结果为5,而不是4。此外,请记住,关于四舍五入的确定取决于最终结果(而不是整数的小数部分)大十进制数,就像您已经假设的那样)。



 类似资料:
  • 问题内容: 我将以下代码与具有Half_even舍入模式的Java BigDecimal setScale方法配合使用,并获得以下结果。 结果:1.11 预期值:1.12 由于最接近5的偶数应该是2,因此我期望的结果是1.12。但是结果是1.11。然后再次, 结果:1.15 预期值:1.14 因为5左边的偶数是4,所以我期望结果是1.14。有什么解释吗? 问题答案: 这是由浮点不精确(在您的输入值

  • 我有一个由数字组成的数据集。我想在一份报告中陈述这一点。我已经设法生成了一个具有以下格式的报告。这有点类似于会计中的试算表。但事实并非如此!表中的数据在其值中有4个小数点。但在报告中,它应该四舍五入到小数点后两位。报告还必须准确,因此需要使用。 基于@marciob、@user3679868和@joopeggen的编辑3决定根据舍入值进行计算。差额。047(.56-.553)显然被冲销了(审计标准

  • 问题内容: 这两个电话有什么区别?(有没有?) 问题答案: 提到但没有直接解决的一个重要问题是 “精度” 和 “比例” 之间的区别以及它们在两个语句中的用法。 “精度” 是数字中有效数字的总数。 “比例” 是小数点右边的位数。 MathContext构造函数仅接受precision和RoundingMode作为参数,因此第一条语句中从未指定scale。 显然接受scale和RoundingMode

  • 我们有以下代码: 我们正在对此进行单元测试,并根据是否在测试类上使用事务性测试得到不同的结果。 我只想知道我们是否应该期望的应用程序与一起考虑,还是在它之前考虑。 例如: 说: 价格=4.00 累计税收=1.20 您是否希望计算结果如下: a) <代码>4.00/1.20=3.33333333-- 或 b)<代码>4.00 / 1.20 = 3.33333333...-- 正如我所说,我们对这段代

  • 我将以下代码与java BigDecimal setScale方法结合使用,并使用半\u偶数舍入模式,得到以下结果。 结果:1.11 预计:1.12 由于距离5最近的偶数数字应该是2,因此我预期的结果是1.12。但结果是1.11。再一次, 结果:1.15 预期:1.14 因为5左边的偶数是4,所以我希望结果是1.14。对此有什么解释吗?

  • 我正在使用开源项目(axil),该项目在java应用程序中实现了一个脚本引擎,我在尝试利用BigDecimal的舍入时遇到了一个主要的绊脚石。似乎BigDecimal正在将我的输入转换为科学符号,然后将我传递的精度应用于数字的SN表示的系数,而不是其非SN表示。例如: 生成的结果。这给我带来了两个问题。首先,我期待()的结果,因此获取会抛出任何涉及结果的数学运算。其次,我不期望,也找不到一种方法来