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

BigDecimal setScale ROUND\u HALF\u似乎不会对每个数字进行操作

林曦之
2023-03-14

当我用刻度2ROUND_HALF_UP10.12445时,我希望得到10.13,因为10.12445-

BigDecimal b = new BigDecimal("10.12445");
b = b.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("10.12445 scale 2 : " + b);  // 10.12

因此,如果我成功地用4、3和2级进行四舍五入,我会得到预期的结果:

BigDecimal a = new BigDecimal("10.12445");
a = a.setScale(4, BigDecimal.ROUND_HALF_UP);
System.out.println("10.12445 scale 4 : " + a); //10.1245
a = a.setScale(3, BigDecimal.ROUND_HALF_UP);
System.out.println("10.1245 scale 3 : " + a); //10.125
a = a.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("10.125 scale 2 : " + a); //10.13

我错过什么了吗?

有没有办法直接得到我期望的结果?

共有2个答案

戈曾琪
2023-03-14

它正在做它应该做的事情:使用小数点2意味着“根据小数点移动后的数字进行四舍五入”。所以我们有10.12445,我们将其视为1012.445,并应用HALF\u向上舍入。1012.445小于1012.5,因此将其四舍五入为1012,从而得到10.12

根据文档:

返回一个BigDecimal,其小数位数为指定值,其未标度值由该BigDecimal的未标度值乘以或除以适当的十次方来确定,以保持其整体值。

高砚
2023-03-14

HALF_UP代码:

舍入模式:向“最近的邻居”舍入,除非两个邻居距离相等,在这种情况下舍入。其行为与圆形模式类似。如果丢弃的分数为≥ 0.5; 否则,其行为与取整模式类似。向下。

这种舍入模式向最近的邻居舍入,只有当邻居同样近时,我们才会做一些不同的事情。对于刻度2,10.12445的邻居是10.12和10.13。哪个更近?他们是否同样近?

10.13 - 10.12445 = 0.00555
10.12445 - 10.12 = 0.00445

显然10.12更接近了,所以这就是结果。

您正在寻找的舍入类型似乎是重复应用半个以上,每次舍入一个小数位,直到小数位数为2:

var number = new BigDecimal("10.12445");
for (int i = number.scale() ; i >= 2 ; i--) {
    number = number.setScale(i, RoundingMode.HALF_UP);
}

这是一种相当奇怪的四舍五入方式,给出了一些不直观的(至少对我来说)结果。

 类似资料:
  • 问题内容: 在python 2.6中,我想对每个字典值执行一个运算,例如,我想对每个字典值乘以2。如何为该任务减少编码? 问题答案:

  • 我正在做一个大批量插入在拉威尔像 这将执行批量插入,一次查询,但仍同时插入多行。 问题是,当我使用时,行不会插入到Algolia中。那么,我怎样才能批量插入到阿尔戈利亚呢? 我不想循环通过我的行和做一个插入一次,因为这将花费额外的请求

  • 因此,这是我第一次使用JBehave,我试图在项目中创建第一个JBehave,但目前似乎测试没有执行这些步骤。最后,测试表明所有测试用例都通过了,没有任何问题,但实际上它们根本没有被执行。我在每个步骤方法中都设置了断点,而且我的调试器根本不会阻止我,更不用说这些步骤当前抛出的异常了。 和测试执行器: 你知道有什么问题吗?

  • 我目前正在使用materialize CSS,似乎我已经遇到了选择字段。 我使用的是他们站点提供的示例,但不幸的是,它呈现在视图中。我想知道是否有其他人能帮上忙。 我要做的是创建一个有两个结尾间隔提供填充的行-然后在内部的两个行项中应该有一个搜索文本输入和一个搜索选择下拉列表。 这是我正在使用的示例:http://materializecss.com/forms.html 提前谢谢你。 下面是所讨

  • 问题内容: 我想使用Python比较列表中的每个可能的对。 假设我有 我想对列表中2个元素的每个组合进行操作(我们称其为foo)。 最终结果应与 我的第一个想法是手动遍历列表两次,但这似乎不是很Python。 问题答案: 在模块中签出。它完全符合您的描述。 这等效于: 编辑: 有两个非常相似的功能,以及,和。为了说明它们之间的区别: 生成所有可能的元素对,包括所有重复项: 生成每个唯一元素对的所有

  • 我正在使用Flink 1.11,我有以下测试用例来尝试基于事件时间的间隔连接。 两个流的数据定义如下: 测试用例定义如下,每个允许4秒延迟: 连接结果如下: 奇怪的是,上面结果中的最后一条记录来自股票流中的,但这条记录在股票流中出现较晚。看到股票流中的以下两条记录,我已经在这个问题上坚持了好几天,我想问为什么这个记录没有被放弃,而是成功地与另一条流(改名流)结合在一起 水印策略使用< code >