精度问题

问题:两个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));
    }
}

产生结果:导致结果不是正确的值

image-20200814104328080

解决方法:

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,十进制为image-20200814105319009,如果需要计算更大的数,那么31显然不够用,BigInteger能够容纳的位数那可就大了,我简单试了一下,上千位没有任何问题,除了容量大之外,还封装了一些操作。

​ BigDecimal的实现利用到了BigInteger,但是所不同的是BigDecimal加入了小数位的概念。

分析源码,看宝藏!!!!!!!

先进行BigInteger的源码:

image-20200814105839373

image-20200814105920910

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()方法的参数,输出其格式化的货币值和百分比。

posted @ 2020-08-14 11:42  且I听  阅读(79)  评论(0)    收藏  举报