概述
- BigDecimal.ROUND_UP
翻译:舍入模式从零舍入。始终在丢弃非零小数之前递增数字。请注意,此舍入模式永远不会减小计算值的大小。
不论正负,保留精度之前的数字加一
0.123456789 保留四位小数结果为:0.1235
-0.123456789 保留四位小数结果为:-0.1235
- BigDecimal.ROUND_DOWN
翻译:舍入模式向零舍入。切勿在舍弃小数(即截断)之前增加数字。请注意,这种舍入模式永远不会增加计算值的大小。
不论正负,保留精度之后的数字直接截掉(丢弃)
0.123456789 保留四位小数结果为:0.1234
-0.123456789 保留四位小数结果为:-0.1234
- BigDecimal.ROUND_CEILING
翻译:舍入模式向正无穷大方向舍入。如果BigDecimal为正,则行为与ROUND_UP相同;如果为负,则表现为ROUND_DOWN。请注意,此舍入模式永远不会减少计算值。
正:ROUND_UP
负:ROUND_DOWN
0.123456789 保留四位小数结果为:0.1235
-0.123456789 保留四位小数结果为:-0.1234
- BigDecimal.ROUND_FLOOR
翻译:舍入模式向负无穷大舍入。如果BigDecimal为正,则行为与ROUND_DOWN相同;如果为负,则表现与ROUND_UP相同。请注意,此舍入模式永远不会增加计算值。
行为和BigDecimal.ROUND_CEILING相反
正:ROUND_DOWN
负:ROUND_UP
0.123456789 保留四位小数结果为:0.1234
-0.123456789 保留四位小数结果为:-0.1235
- BigDecimal.ROUND_HALF_UP
翻译:舍入模式向“最近的邻居”舍入,除非两个邻居都是等距的,在这种情况下将舍入。如果丢弃分数≥0.5,则表现为ROUND_UP;否则,行为与ROUND_DOWN相同。请注意,这是我们大多数人在小学时所教的四舍五入模式。
四舍五入,去掉正负再看
0.123456789 保留四位小数结果为:0.1235
-0.123456789 保留四位小数结果为:-0.1235
- BigDecimal.ROUND_HALF_DOWN
翻译:舍入模式向“最近的邻居”舍入,除非两个邻居都等距,在这种情况下舍入。如果丢弃的分数**>** 0.5,则行为与ROUND_UP相同;否则,行为与ROUND_DOWN相同。
0.123456789 保留四位小数结果为:0.1234
-0.123456789 保留四位小数结果为:-0.1234
- BigDecimal.ROUND_HALF_EVEN
翻译:舍入模式向“最近的邻居”舍入,除非两个邻居都等距,在这种情况下,向偶数邻居舍入。如果舍弃分数左边的数字为奇数,则表现为ROUND_HALF_UP;如果是偶数,则其行为与ROUND_HALF_DOWN相同。请注意,这是舍入模式,当在一系列计算中重复应用时,该模式可将累积误差最小化。
不论正负,精度前的一位是偶数直接截掉,是基数则加一
0.123456789 保留四位小数结果为:0.1234
-0.123456789 保留四位小数结果为:-0.1234
0.12335 保留五位小数结果为:0.1234
-0.12335 保留五位小数结果为:-0.1234
- BigDecimal.ROUND_UNNECESSARY
翻译:舍入模式可以断言所请求的操作具有准确的结果,因此不需要舍入。如果在产生不精确结果的操作上指定了这种舍入模式,则会引发ArithmeticException。
超过精度则报错
0.123456789保留4位小数则抛出异常
示例代码
import java.math.BigDecimal;
public class BigDecimalTest {
public static void main(String[] args) {
BigDecimal bigDecimal1 = new BigDecimal("0.12345");
BigDecimal bigDecimal2 = new BigDecimal("-0.12345");
System.out.println("******************* BigDecimal.ROUND_UP ***********************");
System.out.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.1234
0.1234
0.1234
******************* BigDecimal.ROUND_UNNECESSARY ***********************
0.123450
Exception in thread "main" java.lang.ArithmeticException: Rounding necessary
at 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)
最后
以上就是懦弱紫菜为你收集整理的BigDecimal里面八种舍位模式的全部内容,希望文章能够帮你解决BigDecimal里面八种舍位模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复