diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 0a3aa2a..968b4f9 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -10,7 +10,7 @@ - + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml index b26911b..af673e7 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -2,5 +2,7 @@ + + \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_4_7.xml b/.idea/libraries/Maven__junit_junit_4_7.xml deleted file mode 100644 index 1c50f8b..0000000 --- a/.idea/libraries/Maven__junit_junit_4_7.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/EasyCaptcha.iml b/EasyCaptcha.iml index f1dd1f9..8b16381 100644 --- a/EasyCaptcha.iml +++ b/EasyCaptcha.iml @@ -1,16 +1,18 @@ - + + - + + \ No newline at end of file diff --git a/src/main/java/com/wf/captcha/base/ArithHelper.java b/src/main/java/com/wf/captcha/base/ArithHelper.java index 492f4af..eeb739b 100644 --- a/src/main/java/com/wf/captcha/base/ArithHelper.java +++ b/src/main/java/com/wf/captcha/base/ArithHelper.java @@ -1,137 +1,104 @@ package com.wf.captcha.base; +import java.math.BigDecimal; + /** * 字符串计算器辅助类 - * @link https://www.cnblogs.com/woider/p/5331391.html */ class ArithHelper { // 默认除法运算精度 private static final int DEF_DIV_SCALE = 16; + private static final String ONE = "1"; // 这个类不能实例化 private ArithHelper() { } + // 将double转换为BigDecimal + private static BigDecimal convertToBigDecimal(double value) { + return new BigDecimal(Double.toString(value)); + } + + // 将String转换为BigDecimal + private static BigDecimal convertToBigDecimal(String value) { + return new BigDecimal(value); + } + /** * 提供精确的加法运算。 - * - * @param v1 被加数 - * @param v2 加数 - * @return 两个参数的和 */ - public static double add(double v1, double v2) { - java.math.BigDecimal b1 = new java.math.BigDecimal(Double.toString(v1)); - java.math.BigDecimal b2 = new java.math.BigDecimal(Double.toString(v2)); - return b1.add(b2).doubleValue(); + return convertToBigDecimal(v1).add(convertToBigDecimal(v2)).doubleValue(); } public static double add(String v1, String v2) { - java.math.BigDecimal b1 = new java.math.BigDecimal(v1); - java.math.BigDecimal b2 = new java.math.BigDecimal(v2); - return b1.add(b2).doubleValue(); + return convertToBigDecimal(v1).add(convertToBigDecimal(v2)).doubleValue(); } /** * 提供精确的减法运算。 - * - * @param v1 被减数 - * @param v2 减数 - * @return 两个参数的差 */ - public static double sub(double v1, double v2) { - java.math.BigDecimal b1 = new java.math.BigDecimal(Double.toString(v1)); - java.math.BigDecimal b2 = new java.math.BigDecimal(Double.toString(v2)); - return b1.subtract(b2).doubleValue(); + return convertToBigDecimal(v1).subtract(convertToBigDecimal(v2)).doubleValue(); } public static double sub(String v1, String v2) { - java.math.BigDecimal b1 = new java.math.BigDecimal(v1); - java.math.BigDecimal b2 = new java.math.BigDecimal(v2); - return b1.subtract(b2).doubleValue(); + return convertToBigDecimal(v1).subtract(convertToBigDecimal(v2)).doubleValue(); } /** * 提供精确的乘法运算。 - * - * @param v1 被乘数 - * @param v2 乘数 - * @return 两个参数的积 */ - public static double mul(double v1, double v2) { - java.math.BigDecimal b1 = new java.math.BigDecimal(Double.toString(v1)); - java.math.BigDecimal b2 = new java.math.BigDecimal(Double.toString(v2)); - return b1.multiply(b2).doubleValue(); + return convertToBigDecimal(v1).multiply(convertToBigDecimal(v2)).doubleValue(); } public static double mul(String v1, String v2) { - java.math.BigDecimal b1 = new java.math.BigDecimal(v1); - java.math.BigDecimal b2 = new java.math.BigDecimal(v2); - return b1.multiply(b2).doubleValue(); + return convertToBigDecimal(v1).multiply(convertToBigDecimal(v2)).doubleValue(); } /** - * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。 - * - * @param v1 被除数 - * @param v2 除数 - * @return 两个参数的商 + * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到小数点以后10位,以后的数字四舍五入。 */ - public static double div(double v1, double v2) { return div(v1, v2, DEF_DIV_SCALE); } public static double div(String v1, String v2) { - java.math.BigDecimal b1 = new java.math.BigDecimal(v1); - java.math.BigDecimal b2 = new java.math.BigDecimal(v2); - return b1.divide(b2, DEF_DIV_SCALE, java.math.BigDecimal.ROUND_HALF_UP).doubleValue(); + return div(v1, v2, DEF_DIV_SCALE); } /** - * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。 - * - * @param v1 被除数 - * @param v2 除数 - * @param scale 表示表示需要精确到小数点以后几位。 - * @return 两个参数的商 + * 提供(相对)精确的除法运算,由scale参数指定精度。 */ - 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"); - } - java.math.BigDecimal b1 = new java.math.BigDecimal(Double.toString(v1)); - java.math.BigDecimal b2 = new java.math.BigDecimal(Double.toString(v2)); - return b1.divide(b2, scale, java.math.BigDecimal.ROUND_HALF_UP).doubleValue(); + validateScale(scale); + return convertToBigDecimal(v1).divide(convertToBigDecimal(v2), scale, BigDecimal.ROUND_HALF_UP).doubleValue(); + } + + public static double div(String v1, String v2, int scale) { + validateScale(scale); + return convertToBigDecimal(v1).divide(convertToBigDecimal(v2), scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 提供精确的小数位四舍五入处理。 - * - * @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"); - } - java.math.BigDecimal b = new java.math.BigDecimal(Double.toString(v)); - java.math.BigDecimal one = new java.math.BigDecimal("1"); - return b.divide(one, scale, java.math.BigDecimal.ROUND_HALF_UP).doubleValue(); + validateScale(scale); + return convertToBigDecimal(v).divide(convertToBigDecimal(ONE), scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } public static double round(String v, int scale) { + validateScale(scale); + return convertToBigDecimal(v).divide(convertToBigDecimal(ONE), scale, BigDecimal.ROUND_HALF_UP).doubleValue(); + } + + // 校验scale参数 + private static void validateScale(int scale) { if (scale < 0) { - throw new IllegalArgumentException("The scale must be a positive integer or zero"); + throw new IllegalArgumentException("The scale must be a positive integer or zero"); } - java.math.BigDecimal b = new java.math.BigDecimal(v); - java.math.BigDecimal one = new java.math.BigDecimal("1"); - return b.divide(one, scale, java.math.BigDecimal.ROUND_HALF_UP).doubleValue(); } }