在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.58BigDecimal
是不可变的-确保使用的是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))代码>