概述
文章目录
- ①. 初始化BigDecimal对象
- ②. 特殊的0、1、10的创建
- ③. bigDecimalA.compareTo(bigDecimalB)
- ④. BigDecimal的舍入策略
①. 初始化BigDecimal对象
-
①. 在我们的日常计算中,有时会涉及到比较大的数字之间的计算(如:超大金额的计算,如果是韩元等的话,还要大),这时,使用float、double这样的浮点数就不那么准确了。因为不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。
-
②. 在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。
-
③. BigDecimal bigDecimal = new BigDecimal(xxx);其中,xxx可以是整型数据,也可以是数字内容的字符串数据,但不可以是浮点型数据
BigDecimal bigDecimal1 = new BigDecimal(123);
BigDecimal bigDecimal2 = new BigDecimal("123.123");
BigDecimal bigDecimal3 = new BigDecimal(123.123);
System.out.println(bigDecimal1);//123
System.out.println(bigDecimal2);//123.123
System.out.println(bigDecimal3);//123.1230000000000046611603465862572193145751953125
②. 特殊的0、1、10的创建
- ①. 特殊的0、1、10可以这么创建:
BigDecimal zero = BigDecimal.ZERO;
BigDecimal one = BigDecimal.ONE;
BigDecimal ten = BigDecimal.TEN;
- ②. BigDecimal.ZERO等同于 new BigDecimal(0);
- BigDecimal类加载阶段的准备阶段,这些数组就会被初始化了,那自然就可以正常的提供使用,可以把这些数组中定义的各个BigDecimal类型的对象当作缓存,然后优先取缓存中的对象,避免创建重复的对象,这也能够起到优化代码的作用
- 跟进BigDecimal类中,会发现BigDecimal类中已经定义了一些BigDecimal类型的常量数组,如下:
- 用BigDecimal.ZERO替代new BigDecimal(0)只是一个引子,更多想表达的是,以后要定义BigDecimal类时,先看看有没现成的对象能够使用,避免一些没必要的操作
// Constants
/**
* The value 0, with a scale of 0.
*
* @since 1.5
*/
public static final BigDecimal ZERO =
zeroThroughTen[0];
// Cache of common small BigDecimal values.
private static final BigDecimal zeroThroughTen[] = {
new BigDecimal(BigInteger.ZERO, 0, 0, 1),
new BigDecimal(BigInteger.ONE, 1, 0, 1),
new BigDecimal(BigInteger.valueOf(2), 2, 0, 1),
new BigDecimal(BigInteger.valueOf(3), 3, 0, 1),
new BigDecimal(BigInteger.valueOf(4), 4, 0, 1),
new BigDecimal(BigInteger.valueOf(5), 5, 0, 1),
new BigDecimal(BigInteger.valueOf(6), 6, 0, 1),
new BigDecimal(BigInteger.valueOf(7), 7, 0, 1),
new BigDecimal(BigInteger.valueOf(8), 8, 0, 1),
new BigDecimal(BigInteger.valueOf(9), 9, 0, 1),
new BigDecimal(BigInteger.TEN, 10, 0, 2),
};
③. bigDecimalA.compareTo(bigDecimalB)
-
①. BigDecimalA > bigDecimalB时,比较结果为1
-
②. BigDecimalA = bigDecimalB时,比较结果为0
-
③. BigDecimalA < bigDecimalB时,比较结果为-1
BigDecimal bigDecimal1 = new BigDecimal("4.321");
BigDecimal bigDecimal2 = new BigDecimal("1.234");
BigDecimal bigDecimal3 = bigDecimal1.subtract(bigDecimal2);
System.out.println(bigDecimal1.compareTo(bigDecimal2));//1
System.out.println(bigDecimal2.compareTo(bigDecimal1));//-1
System.out.println(bigDecimal3.compareTo(bigDecimal3));//0
④. BigDecimal的舍入策略
//(1). 取精度为小数点后5位; 策略为四舍五入
BigDecimal bigDecimal1 = bigDecimal.setScale(5, BigDecimal.ROUND_HALF_UP);
System.out.println("策略为四舍五入 = " + bigDecimal1);//bigDecimal1 = 1.97456
// (2). ROUND_CEILING:无论后面是多少(后面是0的话除外),在正常值下,往大变:
BigDecimal bigDecimal2 = new BigDecimal("1.974562460");
// 在正常值下,往大变2.0
System.out.println("在正常值下,往大变"+bigDecimal2.setScale(1,bigDecimal2.ROUND_CEILING));
BigDecimal bigDecimal3 = new BigDecimal("-1.974562460");
//在正常值下,往大变-1.97
System.out.println("在正常值下,往大变"+bigDecimal3.setScale(2,bigDecimal3.ROUND_CEILING));
//(3). ROUND_FLOOR:无论后面是多少(后面是0的话除外),在正常值下,往小变
BigDecimal bigDecimal4 = new BigDecimal("1.974562460");
// 在正常值下,往小变1.9
System.out.println("在正常值下,往小变"+bigDecimal2.setScale(1,bigDecimal2.ROUND_FLOOR));
BigDecimal bigDecimal5 = new BigDecimal("-1.974562460");
// 在正常值下,往小变-1.98
System.out.println("在正常值下,往小变"+bigDecimal3.setScale(2,bigDecimal3.ROUND_FLOOR));
//(4). ROUND_UP:无论后面是多少(后面是0的话除外),在绝对值的角度,往大变:
//(5). ROUND_DOWN:无论后面是多少,都直接丢弃:
//(6). ROUND_HALF_UP:0-4舍,5-9入,在绝对值的角度,舍和入:
//(7). ROUND_HALF_DOWN:0-5舍,6-9入,在绝对值的角度,舍和入:
//(8). ROUND_HALF_EVEN:0-4舍,6-9入,;在绝对值的角度舍和入如果是5,则结果为偶数的一边:
最后
以上就是明理口红为你收集整理的JAVA01_BigDecimal对象的创建、特殊的0、1、10、比较方法、舍入策略①. 初始化BigDecimal对象②. 特殊的0、1、10的创建③. bigDecimalA.compareTo(bigDecimalB)④. BigDecimal的舍入策略的全部内容,希望文章能够帮你解决JAVA01_BigDecimal对象的创建、特殊的0、1、10、比较方法、舍入策略①. 初始化BigDecimal对象②. 特殊的0、1、10的创建③. bigDecimalA.compareTo(bigDecimalB)④. BigDecimal的舍入策略所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复