Java中BigDecimal的8种舍入模式是怎样的
不可变的、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值和32位的整数标度(scale)组成。
在银行、帐户、计费等领域,BigDecimal提供了精确的数值计算。其中8种舍入方式值得掌握。
1、ROUND_UP
舍入远离零的舍入模式。
在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
注意,此舍入模式始终不会减少计算值的大小。
2、ROUND_DOWN
接近零的舍入模式。
在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
注意,此舍入模式始终不会增加计算值的大小。
3、ROUND_CEILING
接近正无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
如果为负,则舍入行为与 ROUND_DOWN 相同。
注意,此舍入模式始终不会减少计算值。
4、ROUND_FLOOR
接近负无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;
如果为负,则舍入行为与 ROUND_UP 相同。
注意,此舍入模式始终不会增加计算值。
5、ROUND_HALF_UP
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。
6、ROUND_HALF_DOWN
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。
7、ROUND_HALF_EVEN
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
如果前一位为奇数,则入位,否则舍去。
以下例子为保留小数点1位,那么这种舍入方式下的结果。
1.15>1.2 1.25>1.2
8、ROUND_UNNECESSARY
断言请求的操作具有精确的结果,因此不需要舍入。
bigDecimal = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
//保留两位小数且向上进位的四舍五入,四舍五入后要重新赋值,不仅只setScale.
java.math.BigDecimal
不可变的、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值和32位的整数标度(scale)组成。
如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以10的负scale次幂。
因此,BigDecimal表示的数值是(unscaledValue × 10-scale)。
与之相关的还有两个类:
java.math.MathContext:
该对象是封装上下文设置的不可变对象,它描述数字运算符的某些规则,如数据的精度,舍入方式等。
java.math.RoundingMode:
这是一种枚举类型,定义了很多常用的数据舍入方式。
这个类用起来还是很比较复杂的,原因在于舍入模式,数据运算规则太多太多,
不是数学专业出身的人看着中文API都难以理解,这些规则在实际中使用的时候在翻阅都来得及。
在银行、帐户、计费等领域,BigDecimal提供了精确的数值计算。其中8种舍入方式值得掌握。
1、ROUND_UP
舍入远离零的舍入模式。
在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
注意,此舍入模式始终不会减少计算值的大小。
2、ROUND_DOWN
接近零的舍入模式。
在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
注意,此舍入模式始终不会增加计算值的大小。
3、ROUND_CEILING
接近正无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
如果为负,则舍入行为与 ROUND_DOWN 相同。
注意,此舍入模式始终不会减少计算值。
4、ROUND_FLOOR
接近负无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;
如果为负,则舍入行为与 ROUND_UP 相同。
注意,此舍入模式始终不会增加计算值。
5、ROUND_HALF_UP
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。
6、ROUND_HALF_DOWN
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。
7、ROUND_HALF_EVEN
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
如果前一位为奇数,则入位,否则舍去。
以下例子为保留小数点1位,那么这种舍入方式下的结果。
1.15>1.2 1.25>1.2
8、ROUND_UNNECESSARY
断言请求的操作具有精确的结果,因此不需要舍入。
如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。
java bigdecimal 中怎么做到:保留n位小数,第n位小数是0的时候也要输出...
import java.math.BigDecimal;public class FormatBigDe { public static void main(String[] args){ BigDecimal decimal = new BigDecimal("213432.421342314");System.out.println(String.format("%.2f", decimal));\/\/学过C语言,应该懂怎么控制 } } ...
bigdeal和big integer比较大小怎么比较?
BigDecimal比大小,需要声明两个BigDecimal类型变量b1和b2,调用equals()方法比较大小。BigDecimal a = new BigDecimal("1.00");BigDecmial b = new BigDecimal(1);想比较一下a和b的大小,一般都会用equals。BigDecimal其他情况简介。使用BigDecimal类构造方法传入double类型时,计算的结果也是不精确的。因...
BigDecimal 怎么比较大小
BigDecimal比较大小使用compareTo(BigDecimal)方法:int flag = bigdemical.compareTo(bigdemical1)。flag = -1,表示bigdemical小于bigdemical1。flag =0,表示bigdemical等于bigdemical1。flag =1,表示bigdemical大于bigdemical1。实际中直接跟0比较就可以了,别跟-1或者1比较。构造方法 BigDecimal...
典怕力雷: 非基本类型BigDecimal引用的对象占用的字节数是可变的,具体大小依赖于你输入的数据量,要求的精度和选择的舍入方法.如果你问的是类型为BigDecimal的引用变量占用的字节数,那只有一个指针变量的大小,目前为4.如果还不懂,请看例子:BigDecimal d=new BigDecimal(1.1); 这里调用BigDecimal的构造函数创建了一个BigDecimal对象,定义d是一个指向这个BigDecimal对象的引用(即用d来保存这个对象的地址),d的大小是4字节,而随着不断地进行计算,譬如通过调用add方法累加更多的大的数据到d指向的对象,这个对象占用的内存会越来越大,它占用的内存大小不固定.
巴林左旗18884862707: java中 BigDecimal类型的可以转换成double型吗?如何转换 - ?
典怕力雷: 可以,例如: BigDecimal a = new BigDecimal(1000.00); double b=a.doubleValue();
巴林左旗18884862707: 如何应用Java的BigDecimal类 - ?
典怕力雷: BigDecimal,用来对超过16位有效位的数进行精确的运算 add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象. subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象. multiply(BigDecimal) BigDecimal对象中的值...
巴林左旗18884862707: java中bigdecimal类型的变量如何相互加减乘除??
典怕力雷: 1、// 加; 1)BigDecimal add = ma.add(mb); 2)System.out.println("加法:"+add); 2、// 减; 1)BigDecimal sub = ma.subtract(mb); 2)System.out.println("减法:"+sub); 3、// 乘; 1)BigDecimal mul = mb.multiply(md); 2)System.out.println("乘法...
巴林左旗18884862707: java中如何对较大的数字进行计算 - ?
典怕力雷: 在Java中针对比较大的数字,有大数类型来进行表示.即BigInteger和BigDecimal两个类. 以BigDecimal为例: BigDecimal bigDecimalA = new BigDecimal("1234567890123456789012345678901"); BigDecimal bigDecimalB = new ...
巴林左旗18884862707: java中写了一个简单计算器,计算0.3*3=0.8999...,有人说要用BigDecimal 类请问要怎么使用最好写一下代码 - ?
典怕力雷: 代码如下: double d = 0.3; BigDecimal bd = new BigDecimal(d+""); BigDecimal bd2 = new BigDecimal(3); System.out.println(bd.multiply(bd2));------------ 需要注意的是, BigDecimal bd = new BigDecimal(d+"");构造函数要传String类型,如果传double类型的话,结果也是0.8999........
巴林左旗18884862707: BigDecimal问题 JAVA - ?
典怕力雷: 测试了下,代码如下:public static void main(String args[]) { BigDecimal b = new BigDecimal(1); BigDecimal a = b.add(new BigDecimal(2)); System.out.println(b); System.out.println(a); } 输出结果为:1 3 也就是原对象的值没被改变啊~ 再仔细看看你哪写错了没吧!~
巴林左旗18884862707: java中的new BigDecimal(0)是什么意思? - ?
典怕力雷: 1.BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成.如果为零或正数,则标度是小数点后的位数.如果为负数,则将该数的非标度值乘以 10 的负scale 次幂.因此,BigDecimal表示的数值是(unscaledValue * 10-scale...
巴林左旗18884862707: java中用bigdecimal编写分数转小数 - ?
典怕力雷: import java.math.BigDecimal; import java.util.Scanner; public class BigDecimalDemo { public static void main(String[] args) { System.out.println("说明:输入分数转小数,比如1/5,精确到小数点后10位"); while(true){ changNum(); } } static ...
巴林左旗18884862707: java 中 BigDecimal 类型转换问题 - ?
典怕力雷: import java.math.*; class test {public static void main (String[] args){BigDecimal a = new BigDecimal(123.56);String str=(a.doubleValue()+"").replaceAll("\\D","");System.out.println(str);} }