在Java中四舍五入一个大十进制并不';t返回预期的数字

在Java中四舍五入一个大十进制并不';t返回预期的数字,java,bigdecimal,Java,Bigdecimal,我有一个名为m_FOBST的属性,它包含以下数字:1.5776。在这里,我试图绕过它: this.m_FOBST.setScale(2, BigDecimal.ROUND_HALF_EVEN) 但是,当我应该得到1.58时,我得到了1.60 有人能解释一下原因吗?BigDecimal是不可变的-确保使用的是setScale()方法返回的值 BigDecimal bd = new BigDecimal("1.5776"); bd = bd.setScale(2, BigDecimal.R

我有一个名为
m_FOBST
的属性,它包含以下数字:
1.5776
。在这里,我试图绕过它:

   this.m_FOBST.setScale(2, BigDecimal.ROUND_HALF_EVEN)
但是,当我应该得到1.58时,我得到了1.60


有人能解释一下原因吗?

BigDecimal
是不可变的-确保使用的是
setScale()
方法返回的值

BigDecimal bd = new BigDecimal("1.5776");

bd = bd.setScale(2, BigDecimal.ROUND_HALF_EVEN);

在这种情况下,
bd
1.58

BigDecimal
是不可变的-确保使用的是
setScale()
方法返回的值

BigDecimal bd = new BigDecimal("1.5776");

bd = bd.setScale(2, BigDecimal.ROUND_HALF_EVEN);

在这种情况下,
bd
1.58

我无法复制它,我得到:groovy:000>d=new BigDecimal(“1.5776”)===>1.5776 groovy:000>d1=d.setScale(2,BigDecimal.ROUND_HALF_偶数)==>1.58尝试将scale设置为3?参见
System.out.println(new BigDecimal(“1.5776”).setScale(2,BigDecimal.ROUND_HALF_偶数))
也打印
1.58
。另外,您应该使用
setScale(2,RoundingMode.HALF_偶数)
,您在这里使用的版本被认为是一个遗留方法。我不能复制这个,我得到:groovy:000>d=new bigdecimic(“1.5776”)==>1.5776 groovy:000>d1=d.setScale(2,bigdimic.ROUND_-HALF_偶数)=>1.58尝试将刻度设置为3?参见
System.out.println(新的BigDecimal(“1.5776”).setScale(2,BigDecimal.ROUND_-HALF_-偶数))
也打印
1.58
。另一个注意事项是,您应该使用
setScale(2,RoundingMode.HALF_偶数)
,您在这里使用的版本被认为是一种传统方法。他可能是,因为他说答案是1.60(并且默认情况下BigDecimal不会四舍五入任何内容)从浮点数创建
BigDecimal
时,应始终使用
String
构造函数。@Keppil为什么这么说?谢谢@Keppil-你说得对。之所以这样做是因为
double
float
不是浮点数的精确表示,这就是为什么要使用
BigDecimal
@sdoca的第一个原因:浮点数是不精确的。运行下面一行来了解我的意思:
System.out.println(新的BigDecimal(1.5776))
他可能是,因为他说答案是1.60(默认情况下BigDecimal不会四舍五入任何内容),当从浮点数创建
BigDecimal
时,您应该始终使用
String
构造函数。@Keppil为什么这么说?谢谢@Keppil-您说得对。之所以这样做是因为
double
float
不是浮点数的精确表示,这就是为什么要使用
BigDecimal
@sdoca的第一个原因:浮点数是不精确的。运行下面一行来了解我的意思:
System.out.println(新的BigDecimal(1.5776))