Java中BigDecimal的8种舍入模式是怎样的

作者&投稿:雀妻 (若有异议请与网页底部的电邮联系)
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.

ava中BigDecimal的8种舍入模式是怎样的?下面长沙欧柏泰克软件学院和大家一起来学习下吧:

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...

巴林左旗18884862707: java语言中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);} }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网