2016-06-27 44 views
1

我有这样的代码:如何比较BigDecimal,但约?

BigDecimal d = ...; 
if (d.compareTo(Expression.PI) == 0) { 
    //do something 
} 

其中Expression.PI是圆周率四舍五入至小数点第100。

但是我不需要比较d是否等于pi,最多可以有100位小数,但是我们只能说20位小数。换句话说,如何检查d是否近似等于pi?

我试图

Expression.PI.setScale(20, RoundingMode.HALF_UP).compareTo(d.setScale(20, RoundingMode.HALF_UP)) == 0; 

Expression.PI.setScale(20, RoundingMode.HALF_UP).compareTo(d) == 0; 

但没有这两个似乎工作。我在这里做错了什么?

+0

你能提供一个你希望工作的数字的例子,但这不符合你的期望吗? – lucasvw

+0

嗯,例如,如果我有数字是pi四舍五入到20位小数。这是行不通的,因为Expression.PI被四舍五入为100位小数。 – leonz

+0

所以你确定你有'**'等于**正好**π圆整到20个地方?首先,很难相信你需要那么高的精度。你可以尝试四舍五入,说5个地方,看看会发生什么。 – lucasvw

回答

1

由于lucasvw在评论中提到,我认为你已经在正确地做,并且你的'd'值肯定有问题。这是一个显示正确结果的测试类。

import java.math.BigDecimal; 
import java.math.RoundingMode; 

public class BigDecimalTest { 

public static void main(String args[]) { 
    BigDecimal PI = new BigDecimal("3.14159265358979323846264338327950288419"); 
    BigDecimal otherValue = new BigDecimal("3.14159"); 

    boolean test = PI.setScale(5, RoundingMode.HALF_UP).compareTo(otherValue) == 0; 

    System.out.println("compareTo: " + test); 
} 
}