BigDecimal.ROUND_UP翻译:舍入模式从零开始舍入。 始终在丢弃非零小数之前递增数字。 请注意,在此舍入模式下,计算值的大小决不会变小。
无论正负,在保持精度前的数字上加1
0.123456789如果保留小数点后4位,则为0.1235
-0.123456789小数第四位的结果是-0.1235
BigDecimal.ROUND_DOWN翻译:舍入模式将舍入为零。 舍弃小数,也就是舍去之前不要增加数字。 请注意,在此舍入模式下,计算值的大小决不会增加。
无论正负,保持精度后的数字直接舍去(
留下0.123456789小数点后4位的结果是0.1234
-0.123456789小数第四位的结果是-0.1234
BigDecimal.ROUND_CEILING翻译:舍入模式向正无穷大方向舍入。 如果BigDecimal为正,则行为与ROUND_UP相同; 如果为负,则表示为ROUND_DOWN。 请注意,在此舍入模式下,计算值永远不会减少。
正: ROUND_UP
负: ROUND_DOWN
0.123456789如果保留小数点后4位,则为0.1235
-0.123456789小数第四位的结果是-0.1234
BigDecimal.ROUND_FLOOR翻译:舍入模式将舍入为负无穷大。 如果BigDecimal为正,则行为与ROUND_DOWN相同。 如果为负,则表示形式与ROUND_UP相同。 请注意,在此舍入模式下,计算值不会增加。
动作与BigDecimal.ROUND_CEILING相反
正: ROUND_DOWN
负: ROUND_UP
留下0.123456789小数点后4位的结果是0.1234
-0.123456789小数第四位的结果是-0.1235
BigDecimal.ROUND_HALF_UP翻译:舍入模式将被舍入为“最近的邻居”。 在这种情况下,只要两个邻居不是等距的,就会被舍入。 销毁分数0.5时,ROUND_UP; 否则,动作与ROUND_DOWN相同。 请注意,这是我们大多数人在小学教的四舍五入模型。
四舍五入,去掉正负来看
0.123456789如果保留小数点后4位,则为0.1235
-0.123456789小数第四位的结果是-0.1235
BigDecimal.ROUND_HALF_DOWN翻译:在这种情况下,对“最近的邻居”的舍入模式是舍入的,除非两个邻居距离相等。 对于放弃的分数**** 0.5,行为与ROUND_UP相同。 否则,动作与ROUND_DOWN相同。
留下0.123456789小数点后4位的结果是0.1234
-0.123456789小数第四位的结果是-0.1234
BigDecimal.ROUND_HALF_EVEN翻译:舍入模式将被舍入为“最近的邻居”。 只要两个邻居不是等距的,就会被偶数邻居舍入。 舍弃分数左边的数字为奇数时,返回ROUND_HALF_UP; 对于偶数,其行为与ROUND_HALF_DOWN相同。 请注意,这是一种舍入模式,在一系列计算中重复应用时,将累积误差最小化。
无论正负,精度前的1位保持偶数舍去,如果是基数则加1
0.123 456789小数第四位的结果是0.1234
-0.123 456789小数第四位的结果为-0.1234
0.123 35小数第五位的结果为0.1234
-0.123 35小数第五位的结果是-0.1234
BigDecimal.ROUND_UNNECESSARY翻译:舍入模式不需要舍入,因为可以断言所请求的操作会产生准确的结果。 如果为生成不正确结果的操作指定此舍入模式,则会抛出ArithmeticException。
如果超过精度,就会发生错误
保留0.123456789小数4位时抛出异常
示例代码
import java.math.BigDecimal; publicclassbigdecimaltest { publicstaticvoidmain (字符串[ ] args ) bigdecimal bigdecimal1=new bigdecimal (0.12345 ); bigdecimal bigdecimal2=new bigdecimal (-0.12345 ); system.out.println (' * * * * * * * * * * * * * * * * * * bigdecimal.round _ up * * * * * * * * * * * * * * * * * * * * * * )
.println(bigDecimal1.setScale(4, BigDecimal.ROUND_UP));System.out.println(bigDecimal2.setScale(4, BigDecimal.ROUND_UP));System.out.println("******************* BigDecimal.ROUND_DOWN ***********************");System.out.println(bigDecimal1.setScale(4, BigDecimal.ROUND_DOWN));System.out.println(bigDecimal2.setScale(4, BigDecimal.ROUND_DOWN));System.out.println("******************* BigDecimal.ROUND_CEILING ***********************");System.out.println(bigDecimal1.setScale(4, BigDecimal.ROUND_CEILING));System.out.println(bigDecimal2.setScale(4, BigDecimal.ROUND_CEILING));System.out.println("******************* BigDecimal.ROUND_FLOOR ***********************");System.out.println(bigDecimal1.setScale(4, BigDecimal.ROUND_FLOOR));System.out.println(bigDecimal2.setScale(4, BigDecimal.ROUND_FLOOR));System.out.println("******************* BigDecimal.ROUND_HALF_UP ***********************");System.out.println(bigDecimal1.setScale(4, BigDecimal.ROUND_HALF_UP));System.out.println(bigDecimal2.setScale(4, BigDecimal.ROUND_HALF_UP));System.out.println("******************* BigDecimal.ROUND_HALF_DOWN ***********************");System.out.println(bigDecimal1.setScale(4, BigDecimal.ROUND_HALF_DOWN));System.out.println(bigDecimal2.setScale(4, BigDecimal.ROUND_HALF_DOWN));System.out.println("******************* BigDecimal.ROUND_HALF_EVEN ***********************");System.out.println(bigDecimal1.setScale(4, BigDecimal.ROUND_HALF_EVEN));System.out.println(bigDecimal2.setScale(4, BigDecimal.ROUND_HALF_EVEN));System.out.println(new BigDecimal("0.12335").setScale(4, BigDecimal.ROUND_HALF_EVEN));System.out.println(new BigDecimal("0.12335").setScale(4, BigDecimal.ROUND_HALF_EVEN));System.out.println("******************* BigDecimal.ROUND_UNNECESSARY ***********************");System.out.println(bigDecimal1.setScale(6, BigDecimal.ROUND_UNNECESSARY));System.out.println(bigDecimal2.setScale(3, BigDecimal.ROUND_UNNECESSARY));}}运行结果
******************* BigDecimal.ROUND_UP ***********************0.1235-0.1235******************* BigDecimal.ROUND_DOWN ***********************0.1234-0.1234******************* BigDecimal.ROUND_CEILING ***********************0.1235-0.1234******************* BigDecimal.ROUND_FLOOR ***********************0.1234-0.1235******************* BigDecimal.ROUND_HALF_UP ***********************0.1235-0.1235******************* BigDecimal.ROUND_HALF_DOWN ***********************0.1234-0.1234******************* BigDecimal.ROUND_HALF_EVEN ***********************0.1234-0.12340.12340.1234******************* BigDecimal.ROUND_UNNECESSARY ***********************0.123450Exception in thread "main" java.lang.ArithmeticException: Rounding necessaryat java.math.BigDecimal.commonNeedIncrement(BigDecimal.java:4179)at java.math.BigDecimal.needIncrement(BigDecimal.java:4235)at java.math.BigDecimal.divideAndRound(BigDecimal.java:4143)at java.math.BigDecimal.setScale(BigDecimal.java:2455)at com.demo.BigDecimalTest.main(BigDecimalTest.java:43)