【java】BigDecimal、BigInteger、大数相乘、数值的整数次方、快速乘法
2017-03-23 22:29
821 查看
BigDecimal
从上面的示例代码中可以感受到float和double不是精确数据 有效位是16位 超过了就不能精确加载了 而BigDecimal可以 但是也是需要注意不能使用double的构造函数 否则也是会存在一定的问题 尤其是在JDBC中,得使用string的构造函数才可以
BigInteger
package Test; import java.math.BigDecimal; public class Test { public static void main(String[] args){ double d1=2.15; double d2=1.10; System.out.println("double运行的结果:"+(d1-d2)); BigDecimal bd1=new BigDecimal("2.15"); BigDecimal bd2=new BigDecimal("1.10"); System.out.println("BigDecimal运行的结果:"+bd1.subtract(bd2)); BigDecimal bd3=new BigDecimal(2.15); BigDecimal bd4=new BigDecimal(1.10); System.out.println("BigDecimal错误运行的结果:"+bd3.subtract(bd4)); } } /* double运行的结果:1.0499999999999998 BigDecimal运行的结果:1.05 BigDecimal错误运行的结果:1.049999999999999822364316059974953532218933105468750 * */
从上面的示例代码中可以感受到float和double不是精确数据 有效位是16位 超过了就不能精确加载了 而BigDecimal可以 但是也是需要注意不能使用double的构造函数 否则也是会存在一定的问题 尤其是在JDBC中,得使用string的构造函数才可以
package Java; import java.math.BigDecimal; /** * 注意点: * 每次计算都是会产生一个新的对象,因此不适合大量运算。适合少量高精度计算 * 在从数值上比较两个 BigDecimal 值时,应该使用 compareTo() 而不是 equals()。这个在BigNumber代码中有体现 *警惕使用BigDecimal(double) 构造函数 例如 ps.setBigDecimal(2, new BigDecimal(0.01)); 在jdbc中可能抛出一些异常 * * 参考资料:http://xiangtui.iteye.com/blog/690427 */ public class BigDecimalTest { //默认除法运算精度 private static final int DEF_DIV_SCALE = 10; /** * 加法运算 * * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 加法运算 * * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ public static BigDecimal add(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.add(b2); } /** * 加法运算 * * @param v1 被加数 * @param v2 加数 * @param scale 保留scale位小数 * @return 两个参数的和 */ public static String add(String v1, String v2, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.add(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString(); } /** * 减法运算 * * @param v1 被减数 * @param v2 减数 * @return 两个参数的差 */ public static double sub(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); } /** * 减法运算。 * * @param v1 被减数 * @param v2 减数 * @return 两个参数的差 */ public static BigDecimal sub(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.subtract(b2); } /** * 减法运算 * * @param v1 被减数 * @param v2 减数 * @param scale 保留scale 位小数 * @return 两个参数的差 */ public static String sub(String v1, String v2, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.subtract(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString(); } /** * 乘法运算 * * @param v1 被乘数 * @param v2 乘数 * @return 两个参数的积 */ public static double mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * 乘法运算 * * @param v1 被乘数 * @param v2 乘数 * @return 两个参数的积 */ public static BigDecimal mul(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.multiply(b2); } /** * 乘法运算 * * @param v1 被乘数 * @param v2 乘数 * @param scale 保留scale 位小数 * @return 两个参数的积 */ public static double mul(double v1, double v2, int scale) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return round(b1.multiply(b2).doubleValue(), scale); } /** * 乘法运算 * * @param v1 被乘数 * @param v2 乘数 * @param scale 保留scale 位小数 * @return 两个参数的积 */ public static String mul(String v1, String v2, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString(); } /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 * 小数点以后10位,以后的数字四舍五入 * * @param v1 被除数 * @param v2 除数 * @return 两个参数的商 */ public static double div(double v1, double v2) { return div(v1, v2, DEF_DIV_SCALE); } /** * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 * 定精度,以后的数字四舍五入 * * @param v1 被除数 * @param v2 除数 * @param scale 表示表示需要精确到小数点以后几位。 * @return 两个参数的商 */ public static double div(double v1, double v2, int scale) { if (scale < 0) { throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 * 定精度,以后的数字四舍五入 * * @param v1 被除数 * @param v2 除数 * @param scale 表示需要精确到小数点以后几位 * @return 两个参数的商 */ public static String div(String v1, String v2, int scale) { if (scale < 0) { throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v1); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toString(); } /** * 提供精确的小数位四舍五入处理 * * @param v 需要四舍五入的数字 * @param scale 小数点后保留几位 * @return 四舍五入后的结果 */ public static double round(double v, int scale) { if (scale < 0) { throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 提供精确的小数位四舍五入处理 * * @param v 需要四舍五入的数字 * @param scale 小数点后保留几位 * @return 四舍五入后的结果 */ public static String round(String v, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(v); return b.setScale(scale, BigDecimal.ROUND_HALF_UP).toString(); } /** * 取余数 * * @param v1 被除数 * @param v2 除数 * @param scale 小数点后保留几位 * @return 余数 */ public static String remainder(String v1, String v2, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.remainder(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString(); } /** * 取余数 BigDecimal * * @param v1 被除数 * @param v2 除数 * @param scale 小数点后保留几位 * @return 余数 */ public static BigDecimal remainder(BigDecimal v1, BigDecimal v2, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } return v1.remainder(v2).setScale(scale, BigDecimal.ROUND_HALF_UP); } /** * 比较大小 不要用equals * * @param v1 被比较数 * @param v2 比较数 * @return 如果v1 大于v2 则 返回true 否则false */ public static boolean compare(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); int bj = b1.compareTo(b2); boolean res; if (bj > 0) res = true; else res = false; return res; } }
BigInteger
package Java; import java.math.BigInteger; public class BigIntegerTest { public BigIntegerTest() { } public static void testBigInteger() { BigInteger bi = new BigInteger("8888888888888888888888888888888888"); //multiply :乘法 BigInteger result = bi.multiply(new BigInteger("2")); System.out.println(result); //divide : 除法 result = bi.divide(new BigInteger("2")); System.out.println(result); //add : 加法 result = bi.add(new BigInteger("232")); System.out.println(result); //subtract :减法 result = bi.subtract(new BigInteger("23122")); System.out.println(result); result = bi.shiftRight(5);//位移运算符 System.out.println(result); } public static void main(String[] args) { testBigInteger(); } }
package Java; import java.math.BigDecimal; import java.math.BigInteger; public class BigNumber { // 默认除法运算精度,即保留小数点多少位 private static final int DEFAULT_DIV_SCALE = 10; // 这个类不能实例化 private BigNumber() { } /** * 加法 * */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return (b1.add(b2)).doubleValue(); } /** * 减法 * */ public static double sub(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return (b1.subtract(b2)).doubleValue(); } /** * 乘法 * */ public static double mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return (b1.multiply(b2)).doubleValue(); } /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到小数点以后多少位,以后的数字四舍五入。 */ public static double div(double v1, double v2) { return div(v1, v2, DEFAULT_DIV_SCALE); } /** * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。 */ public static double div(double v1, double v2, int scale) { if (scale < 0) { System.err.println("除法精度必须大于0!"); return 0; } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return (b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP)).doubleValue(); } /** * 计算阶乘 * * @param n 任意大于等于0的int * @return n阶乘 */ public static BigInteger getFactorial(int n) { if (n < 0) { System.err.println("n必须大于等于0"); return new BigInteger("-1"); } else if (n == 0) { return new BigInteger("1"); } // 将数组换成字符串后构造BigInteger BigInteger result = new BigInteger("1"); for (; n > 0; n--) { // 将数字n转换成字符串后,再构造一个BigInteger对象,与现有结果做乘法 result = result.multiply(new BigInteger(new Integer(n).toString())); } return result; } public static void main(String[] args) { // 如果我们编译运行下面这个程序会看到什么? System.out.println(0.05 + 0.01); System.out.println(1.0 - 0.42); System.out.println(4.015 * 100); System.out.println(123.3 / 100); /* 0.060000000000000005 0.5800000000000001 401.49999999999994 1.2329999999999999*/ //计算阶乘,可以将n设得更大 int n = 100; System.out.println("计算n的阶乘" + n + "! = " + BigNumber.getFactorial(n)); //用double构造BigDecimal BigDecimal bd1 = new BigDecimal(0.1); System.out.println("(bd1 = new BigDecimal(0.1)) = " + bd1.toString()); //用String构造BigDecimal BigDecimal bd2 = new BigDecimal("0.1"); System.out.println("(bd2 = new BigDecimal(\"0.1\")) = " + bd2.toString()); BigDecimal bd3 = new BigDecimal("0.10"); //equals方法比较两个BigDecimal对象是否相等,相等返回true,不等返回false System.out.println("bd2.equals(bd3) = " + bd2.equals(bd3));//false //compareTo方法比较两个BigDecimal对象的大小,相等返回0,小于返回-1,大于返回1。 System.out.println("bd2.compareTo(bd3) = " + bd2.compareTo(bd3));//0 //进行精确计算 System.out.println("0.05 + 0.01 = " + BigNumber.add(0.05, 0.01)); System.out.println("1.0 - 0.42 = " + BigNumber.add(1.0, 0.42)); System.out.println("4.015 * 100 =" + BigNumber.add(4.015, 100)); System.out.println("123.3 / 100 = " + BigNumber.add(123.3, 100)); } }
package Test; public class Test { public static void main(String[] args){ System.out.println(1.0/0.0); System.out.println(Double.isInfinite(1.0/0.0)); System.out.println(Double.NEGATIVE_INFINITY); System.out.println(Double.POSITIVE_INFINITY); } }
package Test; public class Test { public static void main(String[] args){ int i=0; i=i++; System.out.println(i); //0 i=++i; System.out.println(i); //1 i=i++; System.out.println(i); //1 } } /* * 原理分析: * i=i++; * 1.将i的值取出来放在temp中 * 2.i执行自增操作 * 3.将temp的值作为返回值 * 结果值不变 * * 对于i=++i * 其实就是刚好将第二步和第一步互换,所以结果值会加一 * * * */
相关文章推荐
- JAVA大数处理(BigInteger,BigDecimal)
- java 大数类 总结 整数小数(BigInteger和BigDecimal)
- java 大数值BigInteger与BigDecimal
- 【正整数模板运算(C++手写BigInteger类和java.math.BigInteger以及java.math.BigDecimal)】
- JAVA大数处理(BigInteger,BigDecimal)
- JAVA大数处理(BigInteger,BigDecimal)
- java中不用BigInteger实现超大整数的乘法操作
- Java之------大数(BigInteger,BigDecimal)
- JAVA大数处理(BigInteger,BigDecimal)
- java中不用BigInteger实现超大整数的乘法操作
- JAVA大数处理(BigInteger,BigDecimal)
- JAVA大数处理(BigInteger,BigDecimal)
- JAVA大数处理(BigInteger,BigDecimal)
- JAVA大数处理(BigInteger,BigDecimal)
- java常用类库---大数操作(BigInteger,BigDecimal)
- JAVA大数处理(BigInteger,BigDecimal)
- Java高新技术——大数操作(BigInteger、BigDecimal)
- Java基础语法<五> 大数值BigInteger BigDecimal
- Java高新技术——大数操作(BigInteger、BigDecimal)
- JAVA大数处理(BigInteger,BigDecimal)