我想根据以下规则对BigDecimal小数部分进行舍入:
1710.10
变为1710.10
1710.11
变为1710.15
1710.15
变为1710.15
1710.16
变为1710.20
我尝试了这种方法new BigDecimal("1710.11").setScale(2, RoundingMode.HALF_UP))
,期望得到1710.15
,但我得到了1710.11
。我也尝试了Apache Math Utils和Decimal Format,但没有办法实现这一点。
4条答案
按热度按时间col17t5w1#
你的误会
首先,如果当前BigDecimal的小数位数比您指定的要高,那么在BigDecimal上设置小数位数只会返回一个具有不同值的BigDecimal。
比如说,
返回一个新的BigDecimal,等于
new BigDecimal("1710.11")
但是,如果您在本例中的小数位数为2或更低,则新的BigDecimal保持不变(请阅读:相等)。
HALF_UP
简单地表示BigDecimal以5结尾将导致更高的值,例如返回等于
new BigDecimal("1710.12")
的结果现在你的问题
由于你的“舍入”方式实际上并没有改变比例,我怀疑是否有一个已经存在的函数可以使用。然而,用手做其实很简单:
此类生成
(It既未优化也未检查负值,因此不要在关键环境中使用)
7jmck4yq2#
以下是我的解决方案:
测试结果:
cdmah0mi3#
我有时会使用一个
Currency
类和一个round
方法:然后:
uz75evzq4#
大多数人都熟悉从以
5
结尾的分数向上舍入。这将是RoundingMode.HALF_UP
,其中5
或更多向上舍入到相邻数字,如果小于5
则向下舍入。其他模式将在here中详细说明。做你想做的事需要一些定制。在这里,我使用一个lambda,它可以应用于scale value
和BigDecimal
作为参数。它提取整数部分和小数部分,并根据要求对小数部分进行数学调整,返回一个四舍五入的BigDecimal。印刷品
还有几个例子
印刷品