一般开平方使用的是Math中的静态方法
Math.sqrt(double a)
,涉及到金融计算的时候,Math.sqrt(double a)
精度就不够了。金融领域的计算,用的都是BigDecimal类型。然而BigDecimal对于数字开平方没提供有效的方法。
这里整理了一些网上提供的方案。
前言
一般开平方使用的是Math中的静态方法Math.sqrt(double a)
,涉及到金融计算的时候,Math.sqrt(double a)
精度就不够了。金融领域的计算,用的都是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;
}
欢迎吐槽,提供更好的解决方案。
作者:Wuxinshui
出处:http://wuxinshui.github.io
版权归作者所有,转载请注明出处