Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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_Rounding_Bigdecimal - Fatal编程技术网

Java BigDecimal:四舍五入到最接近的整数值

Java BigDecimal:四舍五入到最接近的整数值,java,rounding,bigdecimal,Java,Rounding,Bigdecimal,我需要以下结果 100.12 -> 100.00 100.44 -> 100.00 100.50 -> 101.00 100.75 -> 101.00 .round()或.setScale()?如何执行此操作?您可以使用setScale()将小数位数减少为零。假设value保留要舍入的值: BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP); System.out.println(value + " -

我需要以下结果

100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
.round()
.setScale()
?如何执行此操作?

您可以使用
setScale()
将小数位数减少为零。假设
value
保留要舍入的值:

BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);
使用
round()
有点复杂,因为它需要您指定要保留的位数。在您的示例中,这将是3,但并非对所有值都有效:

BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);

(请注意,
BigDecimal
对象是不可变的;
setScale
round
都将返回一个新对象。)

我不认为可以在一个命令中对其进行那样的舍入。试一试

    ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
    list.add(new BigDecimal("100.12"));
    list.add(new BigDecimal("100.44"));
    list.add(new BigDecimal("100.50"));
    list.add(new BigDecimal("100.75"));

    for (BigDecimal bd : list){
        System.out.println(bd+" -> "+bd.setScale(0,RoundingMode.HALF_UP).setScale(2));
    }

Output:
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
ArrayList list=new ArrayList();
添加(新的大十进制(“100.12”);
添加(新的大十进制(“100.44”);
添加(新的大十进制(“100.50”);
添加(新的大十进制(“100.75”);
用于(BigDecimal bd:list){
System.out.println(bd+“->”+bd.setScale(0,舍入模式。半向上)。setScale(2));
}
输出:
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00

我测试了您剩下的示例,它返回了想要的值,但我不能保证它的正确性。

这里有一个非常复杂的解决方案,但它可以工作:

public static BigDecimal roundBigDecimal(final BigDecimal input){
    return input.round(
        new MathContext(
            input.toBigInteger().toString().length(),
            RoundingMode.HALF_UP
        )
    );
}
测试代码:

List<BigDecimal> bigDecimals =
    Arrays.asList(new BigDecimal("100.12"),
        new BigDecimal("100.44"),
        new BigDecimal("100.50"),
        new BigDecimal("100.75"));
for(final BigDecimal bd : bigDecimals){
    System.out.println(roundBigDecimal(bd).toPlainString());
}
列出大小数=
Arrays.asList(新的BigDecimal(“100.12”),
新的BigDecimal(“100.44”),
新的BigDecimal(“100.50”),
新的大十进制(“100.75”);
for(最终大小数bd:bigDecimals){
System.out.println(roundBigDecimal(bd.toPlainString());
}
输出:

List<BigDecimal> bigDecimals =
    Arrays.asList(new BigDecimal("100.12"),
        new BigDecimal("100.44"),
        new BigDecimal("100.50"),
        new BigDecimal("100.75"));
for(final BigDecimal bd : bigDecimals){
    System.out.println(roundBigDecimal(bd).toPlainString());
}
100
100
101
101

你想要

round(new MathContext(0));  // or perhaps another math context with rounding mode HALF_UP
简单看一下:

以及:

或者如果使用Java6,那么

以及:

setScale(int precision, RoundingMode mode);
round(MathContext mc);

如果我接受格罗德里格斯的回答

System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
这是输出

100.23 -> 100
100.77 -> 101
这不是我想要的,所以我最终做了这个

System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
这就是我得到的

100.23 -> 100.00
100.77 -> 101.00
这就解决了我目前的问题:)
谢谢大家。

它不起作用:100.12:100.12100.44:100.44100.50:100.5100.75:100.75不,设置小数点后返回的新小数点与第一个小数点不同。例如:
BigDecimal bd1=新的BigDecimal(100.12);BigDecimal bd2=bd1.setScale(0,舍入模式,向上舍入一半);System.out.println(bd1.equals(bd2))打印false@Daniel:我在回答中发布的代码片段中已经暗示了这一点。我现在已经明确说明了。
RoundingMode
这是什么?它是
BigDecimal
这没有任何作用。从
round
的文档中可以看出:“如果精度设置为0,则不会进行舍入。”我对第一个结果“不是我想要的…”的说法感到好奇。如果您确实关心输出格式,则可以使用
DecimalFormat
(如
new DecimalFormat(“####.00”)
)来管理将
BigDecimal
转换回字符串的过程。它给出了@Grodriquez代码段和您创建的两个值的结果
“101.00”
。第二次在这里取整是不必要的,因为您知道您已经有一个整数了,所以我会使用bigdecime.ROUND\u,这在我看来是不必要的,更清楚一点。不要认可这个解决方案或任何东西,但是
input.tobiginger().toString().length()
部分使用对数会更有效率,比如
round_up(log(input))+(如果输入是十的幂,则为1,否则为0)