BigDecimal 、BigInteger
package com.BigDecimal; public class BigDecimalDemo { /* * 下面的运算的结果出乎我们的意料,有些准确,有些不准确 * 这是为什么呢? * 我们知道,数据进行运算时先将它转换成为补码进行运算,所以就设计到一个二进制转换的问题 * 浮点数的小数点后面的数是乘以2得1 0计算二进制的对吧,因为有些小数无论如何就是不能得到0, * 也就是一个无限的小数类,这样的数据永远无法得到完整的10表示,所以float和double操作时候 * 出现一个叫做有效数字的说法。当然后面一个是可以的,那是因为两个浮点数刚好可以转换好0101 * 这是因为浮点数的存储和整形的存储不同导致的。它们大部分的时候,都是带有有效数字位 * 引出BigDecimal * 由于在运算的时候,float类型和double很容易丢失精度。所以,为了能精确的表示、计算浮点数,java提供了BigDecimal * BigDecimal类概述 * 不可变的,任意精度的有符号十进制数。可以解决精度丢失问题 */ public static void main(String[] args) { System.out.println(0.09+0.01);//0.09999999999999999 System.out.println(1.0-0.32);//0.6799999999999999 System.out.println(1.015*100);//101.49999999999999 System.out.println(1.301/100);//0.013009999999999999 System.out.println(1.0-0.12);//0.88 } } package com.BigDecimal; import java.math.BigDecimal; /* * 构造方法 * public BigDecimal(String val) * * public BigDecimal add(BigDecimal augend) :加 * public BigDecimal subtract(BigDecimal subtrahend) 减 * public BigDecimal multiply(BigDecimal multiplicand) 乘 * public BigDecimal divide(BigDecimal divisor) 除 * public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode) 商 几位小数 如何舍取 * * */ public class BigDecimalDemo02 { public static void main(String[] args) { // System.out.println(0.09+0.01);//0.09999999999999999 // System.out.println(1.0-0.32);//0.6799999999999999 // System.out.println(1.015*100);//101.49999999999999 // System.out.println(1.301/100);// BigDecimal bd1=new BigDecimal("0.09"); BigDecimal bd2=new BigDecimal("0.01"); System.out.println("add:"+bd1.add(bd2)); System.out.println("--------------------------"); BigDecimal bd3=new BigDecimal("1.0"); BigDecimal bd4=new BigDecimal("0.32"); System.out.println("subtract:"+bd3.subtract(bd4)); System.out.println("--------------------------"); BigDecimal bd5=new BigDecimal("1.015"); BigDecimal bd6=new BigDecimal("100"); System.out.println("multiply:"+bd5.multiply(bd6)); System.out.println("--------------------------"); BigDecimal bd7=new BigDecimal("1.301"); BigDecimal bd8=new BigDecimal("100"); System.out.println("divide:"+bd7.divide(bd8)); System.out.println("--------------------------"); System.out.println("divide:" +bd7.divide(bd8,3,BigDecimal.ROUND_HALF_UP));//ROUND_HALF_UP四舍五入,其他方式舍取看API System.out.println("divide:" +bd7.divide(bd8,8,BigDecimal.ROUND_HALF_UP)); } }
package com.BigInteger; import java.math.BigInteger; public class BigIntegerDemo { /* * 引入BigInteger * Integer的范围是太小了,无法进行大的整数运算 * java.math * 不可变的任意精度的整数。所有操作都以二进制补码进行,说明运算效率高 * 讲一个构造: * BigInteger(String val) * 3个常量: * static BigInteger ONE :常量1 * static BigInteger TEN :常量10 * static BigInteger ZERO :常量0 * 一个方法: * static valueOf(long val) 返回其值等于指定long值得BigInteger */ public static void main(String[] args) { //这几个测试是为了检测超过int范围内,Integer不能在表示,更谈不上计算 /*Integer i=new Integer(100); System.out.println(i); System.out.println(Integer.MAX_VALUE); Integer ii=new Integer("2147483647"); System.out.println(ii); Integer iii=new Integer("2147483648");*/ BigInteger bi=new BigInteger("2147483648"); System.out.println(bi);//看出重写了toString() } } package com.BigInteger; import java.math.BigInteger; /* * 介绍几个常用方法,其他查看API * public BigInteger add(BigInteger val):加 * public BigInteger subtract(BigInteger val):减 * public BigInteger multiply(BigInteger val):乘 * public BigInteger divide(BigInteger val):除 * public BigInteger[] divideAndRemainder(BigInteger val) 商和摩的数组 */ public class BigIntegerDemo2 { public static void main(String[] args) { BigInteger bi1=new BigInteger("100"); BigInteger bi2=new BigInteger("50"); System.out.println("add:"+bi1.add(bi2)); System.out.println("subtract:"+bi1.subtract(bi2)); System.out.println("multiply:"+bi1.multiply(bi2)); System.out.println("divide:"+bi1.divide(bi2)); System.out.println("divideAndRemaunder:"+bi1.divideAndRemainder(bi2)[0]+"\t"+bi1.divideAndRemainder(bi2)[1]); } }