精度问题
问题:两个long类型相乘并且溢出怎么办?
public class MUlLong {
public static void main(String arg[]){
long a=Long.MAX_VALUE;
long b=Long.MAX_VALUE;
System.out.println(String.valueOf(a));
System.out.println(String.valueOf(b));
}
}
产生结果:导致结果不是正确的值
解决方法:
1. 应该避免使用两个long类型的数直接相乘
2. 或者使用bigDecimal方法计算两个数字相乘的结果
代码更改为:
public class MUlLong {
public static void main(String arg[]){
long a=Long.MAX_VALUE;
long b=Long.MAX_VALUE;
BigDecimal big1 = new BigDecimal(String.valueOf(a));
BigDecimal big2 =new BigDecimal(String.valueOf(b));
System.out.println(String.valueOf(a));
System.out.println(String.valueOf(b));
BigDecimal bc=big1.multiply(big2);
System.out.println(bc);
}
}
作于精度计算的主要的有两个:
BigInteger以及integer的确可以用big来形容,它是用于科学计算,Integer只能容纳一个int,所以最大值也就是2的31次方减少1,十进制为,如果需要计算更大的数,那么31显然不够用,BigInteger能够容纳的位数那可就大了,我简单试了一下,上千位没有任何问题,除了容量大之外,还封装了一些操作。
BigDecimal的实现利用到了BigInteger,但是所不同的是BigDecimal加入了小数位的概念。
分析源码,看宝藏!!!!!!!
先进行BigInteger的源码:
valueOf(parament); 将参数转换为制定的类型
String s=”12345”;
BigInteger c=BigInteger.valueOf(s);
则c=12345;
add(); 大整数相加
BigInteger a=new BigInteger(“23”);
BigInteger b=new BigInteger(“34”);
a. add(b);
subtract(); 相减
multiply(); 相乘
divide(); 相除取整
remainder(); 取余
pow(); a.pow(b)=a^b
gcd(); 最大公约数
abs(); 绝对值
negate(); 取反数
mod(); a.mod(b)=a%b=a.remainder(b);
max(); min();
punlic int comareTo();
boolean equals(); 是否相等
BigInteger构造函数:
BigInteger(String val);将其字符串转为十进制
BigInteger(String val,int radix);按照指定基数转化为biginteger
再来看bigDecimal的源码:
由于bigDecimal的封装的方法过于多,想要了解,可以直接看源文件进行分析,我们只对常用的进行使用。
构造函数:
BigDecimal(int)
创建一个具有参数所指定整数值的对象
BigDecimal(double)
创建一个具有参数所指定双精度值的对象
BigDecimal(long)
创建一个具有参数所指定长整数值的对象
BigDecimal(String)
创建一个具有参数所指定以字符串表示的数值的对象
ps:当double必须用作BigDecimal的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用Double.toString(double)方法,然后使用BigDecimal(String)构造方法,将double转换为String。要获取该结果,请使用static valueOf(double)方法。
常用的方法:
add(BigDecimal)
BigDecimal对象中的值相加,返回BigDecimal对象
subtract(BigDecimal)
BigDecimal对象中的值相减,返回BigDecimal对象
multiply(BigDecimal)
BigDecimal对象中的值相乘,返回BigDecimal对象
divide(BigDecimal)
BigDecimal对象中的值相除,返回BigDecimal对象
toString()
将BigDecimal对象中的值转换成字符串
doubleValue()
将BigDecimal对象中的值转换成双精度数
floatValue()
将BigDecimal对象中的值转换成单精度数
longValue()
将BigDecimal对象中的值转换成长整数
intValue()
将BigDecimal对象中的值转换成整数
大小比较可以使用CompareTo
int a = bigdemical.compareTo(bigdemical2)
格式化使用
由于NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制。
以利用BigDecimal对货币和百分比格式化为例。首先,创建BigDecimal对象,进行BigDecimal的算术运算后,分别建立对货币和百分比格式化的引用,最后利用BigDecimal对象作为format()方法的参数,输出其格式化的货币值和百分比。

浙公网安备 33010602011771号