在Java的各种机试题中,经常会出现一些计算,这些计算的结果和运算数可能会超过内置数据类型的大小。这个时候就需要使用BigDecimal类,它可以进行大数的运算;在机试题中,一般会给出各个量取值的范围,这里先给出一个Java中各个内置类型范围:
Java中的八种基本数据类型:byte、short、int、long、float、double、char、boolean
byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1)
short的取值范围为-32768~32767,占用2个字节(-2的15次方到2的15次方-1)
int的取值范围为(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1)
long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2的63次方到2的63次方-1)
float和double是表示浮点型的数据类型,他们之间的区别在于他们的精确度不同
float 3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,同样,e-45表示乘以10的负45次方)占用4个字节
double 1.797693e+308~ 4.9000000e-324 占用8个字节
double型比float型存储范围更大,精度更高,所以通常的浮点型的数据在不声明的情况下都是double型的,如果要表示一个数据是float型的,可以在数据后面加上“F”。
浮点型的数据是不能完全精确的,所以有的时候在计算的时候可能会在小数点最后几位出现浮动,这是正常的。
char用于存放字符的数据类型,占用2个字节,采用unicode编码,它的前128字节编码与ASCII兼容,字符的存储范围在\u0000~\uFFFF
boolean只有两个值,true和false
1、BigDecimal类的初始化
有两种方法初始化,一种是使用double类型,一种是使用String类型
BigDecimal aDouble =new BigDecimal(1.22);
System.out.println("construct with a double value: " + aDouble);
BigDecimal aString = new BigDecimal("1.22");
System.out.println("construct with a String value: " + aString);
输出结果是:
construct with a doublevalue:1.2199999999999999733546474089962430298328399658203125
construct with a String value: 1.22
要注意以下三点:
1、参数类型为double的构造方法的结果有一定的不可预知性。在Java中写入newBigDecimal(0.1)实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
2、另一方面,String 构造方法是完全可预知的:写入 newBigDecimal("0.1") 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法。
3、当double必须用作BigDecimal的源时,最好先使用Double.toString(double)方法,或者String.valueOf(double)将double转换为String,然后使用BigDecimal(String)构造方法。
2、使用BigDecimal
直接使用BigDecimal的方法即可,返回的结果也是个BigDecimal类。
BigDecimal nBigDecimal=new BigDecimal("48556156415465146974");
BigDecimal mBigDecimal=new BigDecimal("44654878978648797");
BigDecimal result=nBigDecimal.multiply(mBigDecimal);
System.out.println(result);
3、保留小数位
如果涉及输出格式问题,还要注意输出的格式。一般在意的都是保留几位小数。ROUND_HALF_UP是BigDecimal的一个常量,表示进行四舍五入的操作。
System.out.println(new BigDecimal("0.2").setScale(2, BigDecimal.ROUND_HALF_UP));// 0.2
System.out.println(new BigDecimal("0.235").setScale(2, BigDecimal.ROUND_HALF_UP));// 0.23
System.out.println(new BigDecimal("0.2351").setScale(2, BigDecimal.ROUND_HALF_UP));// 0.24
System.out.println(new BigDecimal("42").setScale(2, BigDecimal.ROUND_HALF_UP));// 42.0