我们能否在Java中仅使用Java API而不是自定义的100行算法来计算一个BigDecimal
的平方根?
我们能否在Java中仅使用Java API而不是自定义的100行算法来计算一个BigDecimal
的平方根?
public static BigDecimal sqrt( final BigDecimal value )
{
BigDecimal guess = value.multiply( DECIMAL_HALF );
BigDecimal previousGuess;
do
{
previousGuess = guess;
guess = sqrtGuess( guess, value );
} while ( guess.subtract( previousGuess ).abs().compareTo( EPSILON ) == 1 );
return guess;
}
private static BigDecimal sqrtGuess( final BigDecimal guess,
final BigDecimal value )
{
return guess.subtract( guess.multiply( guess ).subtract( value ).divide( DECIMAL_TWO.multiply( guess ), SCALE, RoundingMode.HALF_UP ) );
}
private static BigDecimal epsilon()
{
final StringBuilder builder = new StringBuilder( "0." );
for ( int i = 0; i < SCALE - 1; ++i )
{
builder.append( "0" );
}
builder.append( "1" );
return new BigDecimal( builder.toString() );
}
private static final int SCALE = 1024;
private static final BigDecimal EPSILON = epsilon();
public static final BigDecimal DECIMAL_HALF = new BigDecimal( "0.5" );
public static final BigDecimal DECIMAL_TWO = new BigDecimal( "2" );
BigDecimal.valueOf(Math.sqrt(myBigDecimal.doubleValue()));
myBigDecimal.doubleValue()
时,我们会失去精度,然后我们对一个不太精确的值进行计算,最后再将其转换回 Bigdecimal
。 - uthomas