Java BigDecimal开方

当涉及金融计算并需要高精度时,Math库的开方方法不够精确。本文探讨了三种网上找到的使用Java BigDecimal进行大数开方的解决方案,包括牛顿迭代法,并推荐了方案一作为首选方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

一般开平方使用的是Math中的静态方法Math.sqrt(double a),涉及到金融计算的时候,Math.sqrt(double a)精度就不够了。金融领域的计算,用的都是BigDecimal类型。然而BigDecimal对于数字开平方没提供有效的方法。

这里整理了一些网上提供的方案。

解决方案

方案一

Java 牛顿迭代法求大数开方

这里写图片描述

方案二

纪念我的无聊——BigDecimal平方根的实现

实现代码有点多。

方案三

BigDecimal怎么开方?

这里写图片描述

和方案1类似。

使用方案

参考以上方案,采用方案一。

   /**
     * 标准差σ=sqrt(s^2)
     * 结果精度:scale
     * 牛顿迭代法求大数开方
     *
     * @param x
     * @param scale
     * @return
     */
    public static BigDecimal standardDeviation(BigDecimal[] x, int scale) {
        //方差
        BigDecimal variance = variance(x, scale);
        BigDecimal base2 = BigDecimal.valueOf(2.0);
        //计算精度
        int precision = 100;
        MathContext mc = new MathContext(precision, RoundingMode.HALF_UP);
        BigDecimal deviation = variance;
        int cnt = 0;
        while (cnt < 100) {
            deviation = (deviation.add(variance.divide(deviation, mc))).divide(base2, mc);
            cnt++;
        }
        deviation = deviation.setScale(scale, BigDecimal.ROUND_HALF_UP);
        return deviation;
    }

欢迎吐槽,提供更好的解决方案。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值