package com.util;
public class NumberUtil {
private int precision = 8;// 除法运算的精度,小数位
public NumberUtil(int precision) {
if (precision > 0) {
this.precision = precision;
} else {
this.precision = precision - 1;
}
}
public NumberUtil() {
}
public static void main(String[] args) {
NumberUtil nu = new NumberUtil(20);
System.out.println(System.currentTimeMillis());
System.out.println();
// System.out.println(nu.add(".2", "0.003"));
// System.out.println(nu.minus("100", "-200"));
// System.out.println(nu.multiply("0.00000023",
"67823412"));
System.out.println(nu.divided("36", "5"));
// System.out.println(nu.round("9999.999999999999",
10));
// System.out.println(nu.splitNum("12341234124"));
System.out.println();
System.out.println(System.currentTimeMillis());
}
public String divided(String num1, String num2) {
String ret = "0";
if (num1 == null || num2 == null)
return null;
num1 = num1.replaceAll(" ", "");
num2 = num2.replaceAll(" ", "");
boolean fs1 = false, fs2 = false;
if (num1.length() > 0) {
fs1 = num1.charAt(0) == '-';
if (fs1)
num1 = num1.substring(1);
}
if (num2.length() > 0) {
fs2 = num2.charAt(0) == '-';
if (fs2)
num2 = num2.substring(1);
}
if (fs1 == fs2) {
ret = dividedCore(num1, num2);
} else {
ret = "-" + dividedCore(num1, num2);
}
return ret;
}
private String dividedCore(String num1, String num2) {
String[] nums = trimNum(num1, num2);
num1 = nums[0].replaceAll("\\.", "");
num2 = nums[1].replaceAll("\\.", "");
if ("0".equals(prettyNum(num2)) || "".equals(num2)) {
System.out.println("除数不能为0!");
return null;
}
String tmp = "", ret = "", shang = "0";
boolean enough = true, start = false, step = false;
int i = 0, pos = 0;
while (pos++ < num1.length() || i++ <= precision)
{
if (pos <= num1.length()) {
tmp += num1.substring(pos - 1, pos);
} else {
tmp += "0";
}
enough = true;
shang = "0";
while (enough) {
tmp = minusCore(tmp, num2);
enough = tmp.charAt(0) != '-';
if (enough) {
shang = addCore(shang, "1");
start = true;
} else {
tmp = add(tmp, num2);
}
}
ret += shang;
if ("0".equals(tmp) && start && pos >=
num1.length()) {
step = true;
break;
}
if (pos == num1.length()) {
ret += ".";
}
}
if (ret.indexOf(".") != -1 && !step
&& ret.length() - ret.indexOf(".") > i - 1) {//
对于除不净的四舍五入
ret = round(ret, i - 2);
}
ret = prettyNum(ret);
return ret;
}
public String movePoint(String num, int offset) {
int dot = num.indexOf("."), pos;
dot = dot == -1 ? num.length() : dot;
dot = dot + offset;
pos = dot;
num = num.replaceAll("\\.", "");
if (dot < 0 && offset < 0) {
while (dot++ < 1) {
num = "0" + num;
}
} else if (offset > 0 && dot > num.length())
{
while (dot > num.length()) {
num += "0";
}
}
pos = pos < 0 ? 1 : pos;
StringBuilder s = new StringBuilder(num);
if (pos != num.length())
s.insert(pos, ".");
return s.toString();
}
public String multiply(String num1, String num2) {
String ret = "0";
if (num1 == null || num2 == null)
return null;
num1 = num1.replaceAll(" ", "");
num2 = num2.replaceAll(" ", "");
boolean fs1 = false, fs2 = false;
if (num1.length() > 0) {
fs1 = num1.charAt(0) == '-';
if (fs1)
num1 = num1.substring(1);
}
if (num2.length() > 0) {
fs2 = num2.charAt(0) == '-';
if (fs2)
num2 = num2.substring(1);
}
if (fs1 == fs2) {
ret = multiplyCore(num1, num2);
} else {
ret = "-" + multiplyCore(num1, num2);
}
return ret;
}
private String multiplyCore(String num1, String num2) {
String ret = "0";
int dot = num2.indexOf("."), len = num2.length();
dot = dot == -1 ? num2.length() - 1 : dot;
int tmpNum;
String tmp;
while (len-- > 0) {
tmp = "0";
if (num2.charAt(len) == '.') {
dot--;
continue;
}
tmpNum =
Integer.valueOf(String.valueOf(num2.charAt(len)));
while (tmpNum-- > 0) {
tmp = addCore(num1, tmp);
}
tmp = movePoint(tmp, dot - len);
ret = addCore(ret, tmp);
}
return ret;
}
public String splitNum(String num) {
int end = num.indexOf(".");
if (end == -1) {
end = num.length();
}
StringBuilder s = new StringBuilder(num);
while ((end = end - 3) > 0) {
s.insert(end, ',');
}
return s.toString();
}
public String round(String num, int scale) {
if (scale <= 0)
return num;
String rd = "0.";
int len = scale;
while (scale-- > 0) {
rd += "0";
}
rd += "5";
num = add(num, rd);
num = num.substring(0, num.indexOf(".") + len + 1);
return num;
}
public String minus(String num1, String num2) {
String sum = null;
if (num1 == null || num2 == null)
return null;
num1 = num1.replaceAll(" ", "");
num2 = num2.replaceAll(" ", "");
boolean fs1 = false, fs2 = false;
if (num1.length() > 0) {
fs1 = num1.charAt(0) == '-';
if (fs1)
num1 = num1.substring(1);
}
if (num2.length() > 0) {
fs2 = num2.charAt(0) == '-';
if (fs2)
num2 = num2.substring(1);
}
if (fs1 == fs2) {// 同号
sum = minusCore(num1, num2);
if (fs1 && sum.length() > 0) {
if (sum.charAt(0) == '-') {
sum = sum.substring(1);
} else {
sum = "-" + sum;
}
}
} else {
sum = (fs1 ? "-" : "") + addCore(num1, num2);
}
return sum;
}
private String minusCore(String num1, String num2) {
String[] nums = trimNum(num1, num2);
num1 = nums[0];
num2 = nums[1];
String ret = "";
int length = num1.length();
short a, b, c;
boolean p = false;
while (length-- > 0) {
if (num1.charAt(length) == '.') {
ret = "." + ret;
continue;
}
a = Short.valueOf(String.valueOf(num1.charAt(length)));
b = Short.valueOf(String.valueOf(num2.charAt(length)));
c = (short) (a - b - (p ? 1 : 0));
p = c < 0;
ret = (p ? (c + 10) : c) + ret;
}
ret = p ? minus(num2, num1) : ret;
ret = prettyNum(ret);
return p ? ("-" + ret) : ret;
}
public String add(String num1, String num2) {
String sum = null;
if (num1 == null || num2 == null)
return null;
num1 = num1.replaceAll(" ", "");
num2 = num2.replaceAll(" ", "");
boolean fs1 = false, fs2 = false;
if (num1.length() > 0) {
fs1 = num1.charAt(0) == '-';
if (fs1)
num1 = num1.substring(1);
}
if (num2.length() > 0) {
fs2 = num2.charAt(0) == '-';
if (fs2)
num2 = num2.substring(1);
}
if (fs1 == fs2) {// 同号
sum = (fs1 ? "-" : "") + addCore(num1, num2);
} else {
sum = minusCore(fs1 ? num2 : num1, fs2 ? num2 : num1);
}
return sum;
}
private String addCore(String num1, String num2) {
String[] nums = trimNum(num1, num2);
num1 = nums[0];
num2 = nums[1];
String sum = "";
int length = num1.length();
boolean p = false;
short a, b, c;
while (length-- > 0 || p) {
a = b = 0;
if (length >= 0) {
if (num1.charAt(length) == '.') {
sum = "." + sum;
continue;
}
a = Short.valueOf(String.valueOf(num1.charAt(length)));
b = Short.valueOf(String.valueOf(num2.charAt(length)));
}
c = (short) (a + b + (p ? 1 : 0));
sum = c % 10 + sum;
p = c > 9;
}
return prettyNum(sum);
}
public String[] trimNum(String num1, String num2) {
if (num1.indexOf(".") == -1) {
num1 = num1 + ".";
}
if (num2.indexOf(".") == -1) {
num2 = num2 + ".";
}
while (num1.length() != num2.length()
|| num1.indexOf(".") != num2.indexOf(".")) {
if (num1.indexOf(".") > num2.indexOf(".") ||
num2.indexOf(".") == 0) {
num2 = "0" + num2;
continue;
} else if (num1.indexOf(".") < num2.indexOf(".")
|| num1.indexOf(".") == 0) {
num1 = "0" + num1;
continue;
}
if (num1.length() > num2.length()) {
num2 = num2 + "0";
continue;
} else if (num1.length() < num2.length()) {
num1 = num1 + "0";
}
}
return new String[] { num1, num2 };
}
private String prettyNum(String num) {
if (null == num || "".equals(num))
return num;
int i = 0;
while ('0' == num.charAt(i++) && i <
num.length())
;
num = num.substring(i - 1);
if (num.indexOf(".") != -1) {
i = num.length();
while ('0' == num.charAt(--i))
;
num = num.substring(0, i + 1);
}
i = num.length();
if (i == 1 && '.' == num.charAt(0)) {// 为0
num = "0";
} else if (i > 1 && num.indexOf(".") == 0) {//
在最前面
num = "0" + num;
} else if (i > 1 && num.indexOf(".") == i - 1) {//
在最后面
num = num.substring(0, i - 1);
}
return num;
}
}