求助,BigDecimal怎么开方?因为我操作的数比较大,所以选择了BigDecimal数据类型,但是发现BigDecimal没有开方函数,如果转换为double就有可能丢失数据准确度。我该怎么办?一定要自己写吗?谁有比较好的办法?谢谢!

解决方案 »

  1.   

    import java.math.BigDecimal;
    import java.math.MathContext;public class Test5 {
        
        public static void main(String[] args) {
            BigDecimal n = new BigDecimal("2");        
            BigDecimal r = sqrt(n);
            System.out.println(r.toString());
        }    
        
        public static BigDecimal sqrt(BigDecimal num) {
            if(num.compareTo(BigDecimal.ZERO) < 0) {
                return BigDecimal.ZERO;
            }
            BigDecimal x = num.divide(new BigDecimal("2"), MathContext.DECIMAL128);
            while(x.subtract(x = sqrtIteration(x, num)).abs().compareTo(new BigDecimal("0.0000000000000000000001")) > 0);
            return x;
        }
        
        private static BigDecimal sqrtIteration(BigDecimal x, BigDecimal n) {
            return x.add(n.divide(x, MathContext.DECIMAL128)).divide(new BigDecimal("2"), MathContext.DECIMAL128);
        }
    }