java加减时四舍五入_java中高精度加减乘除及四舍五入、点分法

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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值