package test; import java.math.BigDecimal; import java.math.BigInteger; public class BigRoot { public static BigDecimal bigRoot(BigDecimal number, int n, int scale, int roundingMode) { boolean negate = false; if (n < 0) throw new ArithmeticException(); if (number.compareTo(BigDecimal.ZERO) < 0) { if (n % 2 == 0) throw new ArithmeticException(); else { number = number.negate(); negate = true; } } BigDecimal root; if (n == 0) root = BigDecimal.ONE; else if (n == 1) root = number; else { final BigInteger N = BigInteger.valueOf(n); final BigInteger N2 = BigInteger.TEN.pow(n); final BigInteger N3 = BigInteger.TEN.pow(n - 1); final BigInteger NINE = BigInteger.valueOf(9); BigInteger[] C = new BigInteger[n + 1]; for (int i = 0; i <= n; i++) { C[i] = combination(n, i); } BigInteger integer = number.toBigInteger(); String strInt = integer.toString(); int lenInt = strInt.length(); for (int i = lenInt % n; i < n && i > 0; i++) strInt = "0" + strInt; lenInt = (lenInt + n - 1) / n * n; BigDecimal fraction = number.subtract(number.setScale(0, BigDecimal.ROUND_DOWN)); int lenFrac = (fraction.scale() + n - 1) / n * n; fraction = fraction.movePointRight(lenFrac); String strFrac = fraction.toPlainString(); for (int i = strFrac.length(); i < lenFrac; i++) strFrac = "0" + strFrac; BigInteger res = BigInteger.ZERO; BigInteger rem = BigInteger.ZERO; for (int i = 0; i < lenInt / n; i++) { rem = rem.multiply(N2); BigInteger temp = new BigInteger(strInt.substring(i * n, i * n + n)); rem = rem.add(temp); BigInteger j; if (res.compareTo(BigInteger.ZERO) != 0) j = rem.divide(res.pow(n - 1).multiply(N).multiply(N3)); else j = NINE; BigInteger test = BigInteger.ZERO; temp = res.multiply(BigInteger.TEN); while (j.compareTo(BigInteger.ZERO) >= 0) { //test = res.multiply(BigInteger.TEN); //test = ((test.add(j)).pow(n)).subtract(test.pow(n)); test = BigInteger.ZERO; if (j.compareTo(BigInteger.ZERO) > 0) for (int k = 1; k <= n; k++) test = test.add(j.pow(k).multiply(C[k]).multiply(temp.pow(n - k))); if (test.compareTo(rem) <= 0) break; j = j.subtract(BigInteger.ONE); } rem = rem.subtract(test); res = res.multiply(BigInteger.TEN); res = res.add(j); } for (int i = 0; i <= scale; i++) { rem = rem.multiply(N2); if (i < lenFrac / n) { BigInteger temp = new BigInteger(strFrac.substring(i * n, i * n + n)); rem = rem.add(temp); } BigInteger j; if (res.compareTo(BigInteger.ZERO) != 0) { j = rem.divide(res.pow(n - 1).multiply(N).multiply(N3)); } else j = NINE; BigInteger test = BigInteger.ZERO; BigInteger temp = res.multiply(BigInteger.TEN); while (j.compareTo(BigInteger.ZERO) >= 0) { //test = res.multiply(BigInteger.TEN); //test = ((test.add(j)).pow(n)).subtract(test.pow(n)); test = BigInteger.ZERO; if (j.compareTo(BigInteger.ZERO) > 0) for (int k = 1; k <= n; k++) test = test.add(j.pow(k).multiply(C[k]).multiply(temp.pow(n - k))); if (test.compareTo(rem) <= 0) break; j = j.subtract(BigInteger.ONE); } rem = rem.subtract(test); res = res.multiply(BigInteger.TEN); res = res.add(j); } root = new BigDecimal(res).movePointLeft(scale + 1); if (negate) root = root.negate(); } return root.setScale(scale, roundingMode); } public static BigInteger combination(int n, int k) { if (k > n || n < 0 || k < 0) return BigInteger.ZERO; if (k > n / 2) return combination(n, n - k); BigInteger N1 = BigInteger.ONE; BigInteger N2 = BigInteger.ONE; BigInteger N = BigInteger.valueOf(n); BigInteger K = BigInteger.valueOf(k); for (int i = 0; i < k; i++) { N1 = N1.multiply(N); N2 = N2.multiply(K); N = N.subtract(BigInteger.ONE); K = K.subtract(BigInteger.ONE); } return N1.divide(N2); } public static void main(String args[]) { BigDecimal num = new BigDecimal("1000.0001"); long time; time= System.nanoTime(); BigDecimal root = bigRoot(num, 3, 1000, BigDecimal.ROUND_HALF_UP); time = System.nanoTime() - time; System.out.println(root); System.out.println(root.pow(3)); System.out.println(num); System.out.println(time); } } 以下为输出结果: 10.0000003333333222222228395061316872458161863222069996443615725923887756630007438713414680097705800988567369226190378023011233316151318298014979172337463460332381654769900702245337380592766064363489031133221707083368974347794735772647278781802855960497872836201789050430692950807835048400081570437201937331076691558381730702475666497199047400448962817787407169092111270352801705594658898377317598403118527467631023071009260814221784108319470604240450675399016449052099983061472487326199273653094784597235016160587247012397990271043458536396981242517386531111014749064569809599405614691517123783548889650526597284406147980081368709381876034269097673654153756784794951245167262031684910507341829066742140653278992559205044288533846034120148012881597495601609774002629745803985455105675588727834731887023659182108753504279507890488016749881801221935138196235816816384672705858328654073798508616904976119528845722611857527850664556282784991740967696880583426196869666038063271739302221723365781976212792267 1000.000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003443531978694320864292418567011998735980549072076361991591273338732160284935615157739958424010436591016558690408746632108278557027904339713165333283364571774361290037294804052909765328936695779532486000914250912459979645581467958314551063967796129942489305286501127704717510875844601007316102510814719534884232785051106726291726556179877866491429970185499160375732968391887428469335205932968083931493690999194260489519727689438885168026061250084266829172476629741532657436681189864553467764977425187839654011568673928218757796346552930997641736074852625659800861615851119080339833827156687364510797670146416953238746466569915303297441010763792658081205329391711095571682568816709438162012513022064736654597129490541679699519446795211811051296553847905814269490899958742046197887363661188702757265403801118712810634170528616353023444356045043117346238874662586823835921617080038321853233842235077960533733942934051344705595144806853510674999683546555369140725650079662865984812002328684711830609859740036129575715755802907534731363002562758461534950968294432331036106430061656711497056369637515095476990688185826520146257297673370495355237790984321488918389041922512125187887129245896175717901990799999184644474840572692906525050387602955834299950585872544967009413944838687776941343717675600801593995745435603958840509404054897932541356950374327148724067814452547390826847240366084869627520944013193197794945016310684103251437694556662525939860824636884683214300111016863556162106142219601286521916760281559293827960461274945030167146200973820624864282114912183094310487269834395456454137599691073644786017331731553831731894345146154450865486884952103155701122230209273823610362240575235987764784788341492952221462343258240016131288466918049537266504432489555917166773954398350946533417855003258924442896724315527447878971139713119279780033305620321518521355978339525821297359068159250884313812298565740652635890352996907093047938965006641706696380893615460212455158458766121879933936997416435669698163 1000.0001 123139847