简介:
在前面的章节中,我们自定了一个判断大数值是否为整数的方法,今天我们针对这个方法进行展开论述。
我们可以想象一下:既然能够判断一个数值是否为整数,那么就应该有机会将它的整数部分和小数部分分割开来,也就是我们常说的取整(它同时包含了取小数),在我们初学JAVA时,我们常用的方法是强制转换,或者利用BigDecimal.ROUND语句来进行保留0位小数。今天我们用另一个方法来处理,实现取整(取小数)、特定位数的数值、保留几位小数、以及所有自幂数的输出。这个方法是不涉及精度处理的,也没有强制意味。
一、判断数值是否为整数
判断一个数是否为整数的方法有很多,在此我们利用取商取余的方式进行判断,取商、取余的方法我们稍后会进行讲解。
在此我们要考虑一个非常特殊的数字:1,数字1能够整除任何整数,如果不能整除,则可以判定其不是整数。
相应的代码笔者将会以资源的方式进行上传,在此不作累述,仅仅对其进行测试。
/**
*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BigDecimal number01 = BigDecimal.valueOf(1.23);
BigDecimal digitPart01 = number01.remainder(BigDecimal.ONE).stripTrailingZeros();
BigDecimal intPart01 = number01.subtract(digitPart01).stripTrailingZeros();
System.out.println("1.23 的整数部分:" + intPart01);
System.out.println("1.23 的小数部分:" + digitPart01);
BigDecimal number02 = BigDecimal.valueOf(-21.423);
BigDecimal digitPart02 = number02.remainder(BigDecimal.ONE).stripTrailingZeros();
BigDecimal intPart02 = number02.subtract(digitPart02).stripTrailingZeros();
System.out.println("-21.423 的整数部分:" + intPart02);
System.out.println("-21.423 的小数部分:" + digitPart02);
}
运行结果:
1.23 的整数部分:1
1.23 的小数部分:0.23
-21.423 的整数部分:-21
-21.423 的小数部分:-0.423
在此,我们仅仅对小数点进行了“分割”处理,当然,如果计较负数的整数小数部分的取值方法,main()方法中的相应代码则需要修改(比如-1.7,靠近且比-1.7小的整数为-2,则其整数部分为2,小数部分为0.3,需要对其进行减法运算以及绝对值处理,代码则不能这么写)。本方法其实是根据数字1的特性来处理的:1能够整除任何整数,换言之,只要是整数,都能够被1整除,也就是说余数为0。同理我们利用数字2的特性可以判断一个数的奇偶性。
二、取整、取小数
小数点是一个特殊的符号,它将一个数值分为整数和小数两个部分,我们读数时,前面是个位数、十位数……,后面是十分位数、百分位数……而没有0位数,这有点类似公元纪年法,有公元前、公元后,而没有公元0年。
/**
* 整数部分、小数部分
*
* @param number
*/
private static void integerDecimal(BigDecimal number) {
// TODO Auto-generated method stub
BigDecimal zhengShu;
BigDecimal xiaoShu;
if (intNumber(number)) {
zhengShu = number.stripTrailingZeros();
System.out.println(number + "的整数部分为:" + zhengShu);
} else if (!intNumber(number)) {
BigDecimal number01 = bigAbsolute(number);
xiaoShu = number01.remainder(BigDecimal.ONE).stripTrailingZeros();
zhengShu = number01.subtract(xiaoShu).stripTrailingZeros();
System.out.println(number + "的整数部分为:" + zhengShu + "、小数部分为:" + xiaoShu);
}
}
一个数不能被1整除,那么就有余数,其余数必为小数部分,因此我们可以如此拆分。
stripTrailingZeros(),这是BigDecimal类自带的原生方法,它的目的是去除小数点后尾部无效的0(当然在保留特定位数的小数时可能会用到),同时这个方法也为原数值的精度保留提供了一定的帮助,让数值不会“失真”(比如在进行了一系列复杂的、循环性的计算之后,利用这个方法可以确保结果以“1”的方式输出,而不会出现0.9999999……的情况)。
我们在main(){ }方法中输入几个数字进行测试一下:
integerDecimal(Bi