Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BigDecimal舍入模式问题_Java_Bigdecimal - Fatal编程技术网

Java BigDecimal舍入模式问题

Java BigDecimal舍入模式问题,java,bigdecimal,Java,Bigdecimal,我需要使用BigDecimal roundingmode.xxx和setScale(2)获得这些结果: 其中,RoundingMode.xxx必须与三个给定值相同 我尝试了所有组合,但没有成功,Microsoft Excel成功地设置了三个结果。您正在寻找的 舍入模式向“最近邻”舍入,除非两者都有 邻居是等距的,在这种情况下,四舍五入。表现为 舍入模式。如果丢弃的分数大于0.5;否则,行为 至于RoundingMode.DOWN 例如: public static void main(Strin

我需要使用BigDecimal roundingmode.xxx和setScale(2)获得这些结果:

其中,RoundingMode.xxx必须与三个给定值相同

我尝试了所有组合,但没有成功,Microsoft Excel成功地设置了三个结果。

您正在寻找的

舍入模式向“最近邻”舍入,除非两者都有 邻居是等距的,在这种情况下,四舍五入。表现为 舍入模式。如果丢弃的分数大于0.5;否则,行为 至于RoundingMode.DOWN

例如:

public static void main(String args []){

  System.out.println(new BigDecimal("5.789").setScale(2, RoundingMode.HALF_DOWN));
  System.out.println(new BigDecimal("2.894").setScale(2, RoundingMode.HALF_DOWN));
  System.out.println(new BigDecimal("2.895").setScale(2, RoundingMode.HALF_DOWN));

}
输出

5.79
2.89
2.89
您可以使用:

舍入模式向“最近邻”舍入,除非两者都有 邻居是等距的,在这种情况下,四舍五入。表现为 如果丢弃的分数大于0.5,则进行四舍五入;否则,表现为 把你打倒

请输入:

static void roundTo(BigDecimal input)
{
    BigDecimal output = input.setScale(2, BigDecimal.ROUND_HALF_DOWN);
    System.out.println(input + " => " + output);
}

roundTo(new BigDecimal("5.789"));
roundTo(new BigDecimal("2.894"));
roundTo(new BigDecimal("2.895"));
这将产生:

5.789 => 5.79
2.894 => 2.89
2.895 => 2.89

编辑:根据您的评论,以下内容可能适合您:

BigDecimal output = input.setScale(3, BigDecimal.ROUND_HALF_DOWN).setScale(2, BigDecimal.ROUND_HALF_DOWN);

问题是,当我将两个
BigDecimal
数字相乘时,我得到了一个很大的结果。在那之后,我使用了
setScale(2,half-down)
,但没有得到想要的结果

错误的结果

"2.89500004313886165618896484375".setScale(2, BigDecimal.ROUND_HALF_DOWN);
我需要2.89,错误的结果是2.90

使用
.round(新的MathContext(2))
我得到了它:

 "2.89500004313886165618896484375".round(new MathContext(2));

正确的结果是2.89

我们得到了几乎相同的答案xd我不知道会发生什么,但我没有在四舍五入时得到它。我的值为:2.89500004313886165618896484375,使用setScale(..)后,结果为2。90@Al2x(1)从上面的文档链接可以明显看出,大于
0.5
的分数将被四舍五入。(2) 请在问题中包含正确的示例。BigDecimal retFrete=valorTotal.multiply(新的BigDecimal(compPreco.getPc_frete()/100));compPreco.setValorRS_frete(retFrete.setScale(2,BigDecimal.ROUND_HALF_DOWN));getPc_frete=10.0,valorTotal为28.95请尝试使用完整值进行解析:2.89500004313886165618896484375您将得到2.89500004313886165618896484375=>2.90
 "2.89500004313886165618896484375".round(new MathContext(2));