在我的代码中进行了一系列计算之后,我得到了一个值为0.01954的BigDecimal然后,我需要将此BigDecimal乘以100,并希望计算出的值为1.95我不希望执行任何向上或向下舍入,我只希望截断任何超过两位小数的值我试着将scale设置为2,但是得到了一个ArithmeticException,它说舍入是必要的。如果不指定舍入,我怎么设置scale呢?
0.01954
BigDecimal
100
1.95
ArithmeticException
6ju8rftf1#
请使用舍入模式.DOWN或舍入模式. FLOOR。
BigDecimal newValue = myBigDecimal.setScale(2, RoundingMode.DOWN);
2ekbmq322#
使用包含RoundingMode的setScale覆写:
value.setScale(2, RoundingMode.DOWN);
yeotifhr3#
当我使用一个BigDecimal来设置另一个BigDecimal时,遇到了截断问题。源代码可以包含具有不同十进制值的任何值。
BigDecimal source = BigDecimal.valueOf(11.23); // could 11 11.2 11.234 11.20 etc
为了正确地将其截断和缩放为两位小数,我不得不使用源代码的字符串值,而不是BigDecimal或double值。
new BigDecimal(source.toPlainString()).setScale(2, RoundingMode.FLOOR))
我用这个来表示货币,结果总是有2个小数位。
but5z9lq4#
(7.777).setScale(2,舍入模式.向下).stripTrailingZeros()结果:7.77(7.7).setScale(2,舍入模式.向下).stripTrailingZeros()结果:7.7(77).setScale(2,舍入模式.向下).stripTrailingZeros()结果:77例
von4xj4u5#
就我所测试的四舍五入函数而言,它并没有什么魔力。
BigDecimal val2 = new BigDecimal(45.9); System.out.println(val2.setScale(2,RoundingMode.DOWN));
结果:45.89最好的方法是从sql端强制转换,或者编写一个util函数,乘以100并传递给一个整数,再除以100并传递给一个BigDecimal。在我的情况下,我使用
sql:- CAST(<VALUE> AS decimal(10,2)).
5条答案
按热度按时间6ju8rftf1#
请使用舍入模式.DOWN或舍入模式. FLOOR。
2ekbmq322#
使用包含RoundingMode的setScale覆写:
yeotifhr3#
当我使用一个BigDecimal来设置另一个BigDecimal时,遇到了截断问题。源代码可以包含具有不同十进制值的任何值。
为了正确地将其截断和缩放为两位小数,我不得不使用源代码的字符串值,而不是BigDecimal或double值。
我用这个来表示货币,结果总是有2个小数位。
but5z9lq4#
(7.777).setScale(2,舍入模式.向下).stripTrailingZeros()
结果:7.77
(7.7).setScale(2,舍入模式.向下).stripTrailingZeros()
结果:7.7
(77).setScale(2,舍入模式.向下).stripTrailingZeros()
结果:77例
von4xj4u5#
就我所测试的四舍五入函数而言,它并没有什么魔力。
结果:45.89
最好的方法是从sql端强制转换,或者编写一个util函数,乘以100并传递给一个整数,再除以100并传递给一个BigDecimal。
在我的情况下,我使用