【java笔记】java中⽤于⼩数进位的BigDecimal.setScale⽅法
BigDecimal.setScale主要⽤于对BigDecimal数据⼩数点后的位数进⾏进位、舍位、截断等操作。其进位⽅式主要有以下8种,依次分别对应着数字0~7,即写它们和写它们对应的数字是等价的。
ROUND_UP:⼩数点后指定位之后的数⽆论多⼤,都往⾼位进⼀
ROUND_DOWN:⼩数点后指定位之后的数⽆论多⼤,全部舍弃
ROUND_CEILING:如果是正数,相当于ROUND_UP,如果是负数,相当于ROUND_DOWN
ROUND_FLOOR:和ROUND_CEILING正好相反,如果是正数,相当于ROUND_DOWN,如果是负数,相当于ROUND_UP
ROUND_HALF_UP:若指定位数后若>=0.5,则进位,反之舍弃。
如3.0499,⼩数点后1位后⾯为499,是<0.5的,所以不进位,变为3.0
⽽3.0500,⼩数点后1位后⾯为500,是>=0.5的,所以要进位,变为3.1
ROUND_HALF_DOWN:若指定位数后若>0.5,则进位,反之舍弃。
如3.0501,⼩数点后1位后⾯为501,是>0.5的,所以要进位,变为3.1
⽽3.0500,⼩数点后1位后⾯为500,是=0.5的,所以不进位,变为3.0
ROUND_HALF_EVEN:若指定位为偶数,则做ROUND_HALF_DOWN,反之做ROUND_HALF_UP
ROUND_UNNECESSARY:若指定的位数>=⼩数位数,则抛异常java.lang.ArithmeticException: Rounding necessary
空讲理论⽆益,直接看下⾯的例⼦:
package ecnu;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class BigDecimalTest {
public static void getScale(BigDecimal num, Integer type){
for(int i =0; i <10; i++){
try{
System.out.print("i: "+ i +"  ");
System.out.println(num.setScale(i, type));
}catch(Exception e){
e.printStackTrace();
}
}
System.out.println();
BigDecimal negate = ate();
for(int i =0; i <10; i++){
try{
System.out.print("i: "+ i +"  ");
System.out.println(negate.setScale(i, type));
}catch(Exception e){
e.printStackTrace();
}
}
System.out.println("\n");
}
public static void main(String[] args){
// 建议使⽤字符串形式定义,这样不会损失精度
BigDecimal num =new BigDecimal("3.123456789");
List<Integer> lst =new ArrayList<>();
// ROUND_UP:⼩数点后指定位之后的数⽆论多⼤,都往⾼位进⼀
lst.add(BigDecimal.ROUND_UP);
// ROUND_DOWN:⼩数点后指定位之后的数⽆论多⼤,全部舍弃
lst.add(BigDecimal.ROUND_DOWN);
lst.add(BigDecimal.ROUND_DOWN);
// ROUND_CEILING:如果是正数,相当于ROUND_UP,如果是负数,相当于ROUND_DOWN
lst.add(BigDecimal.ROUND_CEILING);
// ROUND_FLOOR:和ROUND_CEILING正好相反,如果是正数,相当于ROUND_DOWN,如果是负数,相当于ROUND_UP        lst.add(BigDecimal.ROUND_FLOOR);
/* ROUND_HALF_UP:若指定位数后若>=0.5,则进位,反之舍弃。
如3.0499,⼩数点后1位后⾯为499,是<0.5的,所以不进位,变为3.0
⽽3.0500,⼩数点后1位后⾯为500,是>=0.5的,所以要进位,变为3.1
*/
lst.add(BigDecimal.ROUND_HALF_UP);
/* ROUND_HALF_DOWN:若指定位数后若>0.5,则进位,反之舍弃。
如3.0501,⼩数点后1位后⾯为501,是>0.5的,所以要进位,变为3.1
⽽3.0500,⼩数点后1位后⾯为500,是=0.5的,所以不进位,变为3.0
*/
lst.add(BigDecimal.ROUND_HALF_DOWN);
// ROUND_HALF_EVEN:若指定位为偶数,则做ROUND_HALF_DOWN,反之做ROUND_HALF_UP
lst.add(BigDecimal.ROUND_HALF_EVEN);
// ROUND_UNNECESSARY:若指定的位数>=⼩数位数,则抛异常java.lang.ArithmeticException: Rounding necessary
// 在下⾯的例⼦中,由于num⼩数点后有9位,所以当i>=9时就会抛异常,⽽i<9时⽆输出。
lst.add(BigDecimal.ROUND_UNNECESSARY);
String[] name =new String[]{"ROUND_UP","ROUND_DOWN","ROUND_CEILING","ROUND_FLOOR","ROUND_HALF_UP", "ROUND_HALF_DOWN","ROUND_HALF_EVEN","ROUND_UNNECESSARY"};
for(int i =0; i < lst.size(); i++){
System.out.println(name[i]+":");
getScale(num, (i));
}
}
}
其输出为:
ROUND_UP:
i: 0  4
bigdecimal转换为integeri: 1  3.2
i: 2  3.13
i: 3  3.124
i: 4  3.1235
i: 5  3.12346
i: 6  3.123457
i: 7  3.1234568
i: 8  3.12345679
i: 9  3.123456789
i: 0  -4
i: 1  -3.2
i: 2  -3.13
i: 3  -3.124
i: 4  -3.1235
i: 5  -3.12346
i: 6  -3.123457
i: 7  -3.1234568
i: 8  -3.12345679
i: 9  -3.123456789
ROUND_DOWN:
i: 0  3
i: 1  3.1
i: 2  3.12
i: 3  3.123
i: 4  3.1234
i: 5  3.12345
i: 6  3.123456
i: 7  3.1234567
i: 8  3.12345678 i: 9  3.123456789
i: 0  -3
i: 1  -3.1
i: 2  -3.12
i: 3  -3.123
i: 4  -3.1234
i: 5  -3.12345
i: 6  -3.123456
i: 7  -3.1234567
i: 8  -3.12345678 i: 9  -3.123456789
ROUND_CEILING: i: 0  4
i: 1  3.2
i: 2  3.13
i: 3  3.124
i: 4  3.1235
i: 5  3.12346
i: 6  3.123457
i: 7  3.1234568
i: 8  3.12345679 i: 9  3.123456789
i: 0  -3
i: 1  -3.1
i: 2  -3.12
i: 3  -3.123
i: 4  -3.1234
i: 5  -3.12345
i: 6  -3.123456
i: 7  -3.1234567
i: 8  -3.12345678 i: 9  -3.123456789
ROUND_FLOOR: i: 0  3
i: 1  3.1
i: 2  3.12
i: 3  3.123
i: 4  3.1234
i: 5  3.12345
i: 6  3.123456
i: 7  3.1234567
i: 8  3.12345678 i: 9  3.123456789
i: 0  -4
i: 1  -3.2
i: 2  -3.13
i: 3  -3.124
i: 4  -3.1235
i: 5  -3.12346
i: 6  -3.123457
i: 7  -3.1234568
i: 8  -3.12345679 i: 9  -3.123456789
ROUND_HALF_UP: i: 0  3
i: 1  3.1
i: 2  3.12
i: 3  3.123
i: 4  3.1235
i: 5  3.12346
i: 6  3.123457
i: 7  3.1234568
i: 8  3.12345679
i: 9  3.123456789
i: 0  -3
i: 1  -3.1
i: 2  -3.12
i: 3  -3.123
i: 4  -3.1235
i: 5  -3.12346
i: 6  -3.123457
i: 7  -3.1234568
i: 8  -3.12345679
i: 9  -3.123456789
ROUND_HALF_DOWN: i: 0  3
i: 1  3.1
i: 2  3.12
i: 3  3.123
i: 4  3.1235
i: 5  3.12346
i: 6  3.123457
i: 7  3.1234568
i: 8  3.12345679
i: 9  3.123456789
i: 0  -3
i: 1  -3.1
i: 2  -3.12
i: 3  -3.123
i: 4  -3.1235
i: 5  -3.12346
i: 6  -3.123457
i: 7  -3.1234568
i: 8  -3.12345679
i: 9  -3.123456789
ROUND_HALF_EVEN: i: 0  3
i: 1  3.1
i: 2  3.12
i: 3  3.123
i: 4  3.1235
i: 5  3.12346
i: 6  3.123457
i: 7  3.1234568
i: 8  3.12345679
i: 9  3.123456789
i: 0  -3
i: 1  -3.1
i: 2  -3.12
i: 3  -3.123
i: 4  -3.1235
i: 5  -3.12346
i: 6  -3.123457
i: 7  -3.1234568
i: 7  -3.1234568
i: 8  -3.12345679
i: 9  -3.123456789
ROUND_UNNECESSARY:
i: 0  i: 1  i: 2  i: 3  i: 4  i: 5  i: 6  i: 7  i: 8  i: 9  3.123456789
i: 0  i: 1  i: 2  i: 3  i: 4  i: 5  i: 6  i: 7  i: 8  i: 9  -3.123456789
java.lang.ArithmeticException: Rounding necessary
at java.math.BigDecimalmonNeedIncrement(BigDecimal.java:4179) at java.dIncrement(BigDecimal.java:4235)
at java.math.BigDecimal.divideAndRound(BigDecimal.java:4143)
at java.math.BigDecimal.setScale(BigDecimal.java:2455)
at Scale(BigDecimalTest.java:13)
at ecnu.BigDecimalTest.main(BigDecimalTest.java:65)
...

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。