在java中舍入一个double

时间:2013-10-05 14:53:44

标签: java rounding

我已经阅读了其他一些帖子,它们似乎适用于其他人,但是当我试用它们时,它们无法工作。我刚开始学习编程Java,我似乎无法理解如何舍入小数。

我试过

answer = input * input;
answer = answer*1000;   // Rounds the number to to three decimals points
answer = Math.round(answer);
answer = answer/1000;

我也尝试过(如评论中所述),但它只显示相同的数字

double input = 1.0345;
Double.valueOf(new DecimalFormat("#.##").format(input));  // 2 decimal-places
System.out.println("1.0345 rounded is " + input);

但它似乎无法发挥作用。

2 个答案:

答案 0 :(得分:1)

如果您处理精确值(特别是金额,利率......),您必须避免浮点值/算术。浮点变量可以采用非常大的值范围,但它们并不精确。特别是在计算长期或非常不同的数量时,您会遇到麻烦。舍入错误可能会累积。这是由十进制数的宽值范围以固定长度的32/64位二进制值存储的方式引起的。例如,无辜的友好值0.1作为二进制浮点值非常困难。有关详细信息,请参阅IEEE 754规范。

因此,在这些情况下,您必须使用数据类型进行精确计算。 Java提供BigDecimal类。避免浮点精度错误的另一个方法是仅使用整数进行计算,然后格式化输出以使其具有一定数量的小数位。

但是,由于Java为定点数学(BigDecimal)提供了一个很好的即用型课程,你可以尝试一下。看看这个小例子代码片段。您可以从多个不同的rounding modes中进行选择,并确定您希望拥有的小数位数。

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

public class RoundTest {

    public static void main(String[] args) {

        String userInput = "42.133742";
        BigDecimal startValue = new BigDecimal(userInput);

        BigDecimal multFactor = new BigDecimal("1.23");   // => increase by 23 %

        BigDecimal result = startValue.multiply(multFactor);

        System.out.println("Original result without rounding: " + result);
        System.out.println("Scale: " + result.scale());

        // Compare different rounding modes:

        final int DECIMAL_PLACES = 2;
        BigDecimal roundDown   = result.setScale(DECIMAL_PLACES, RoundingMode.DOWN);
        BigDecimal roundHalfUp = result.setScale(DECIMAL_PLACES, RoundingMode.HALF_UP);
        BigDecimal roundUp     = result.setScale(DECIMAL_PLACES, RoundingMode.UP);

        System.out.println("Round down (" + DECIMAL_PLACES + " decimal places): " + roundDown);
        System.out.println("Round half-up (" + DECIMAL_PLACES + " dec. places): " + roundHalfUp);
        System.out.println("Round up (" + DECIMAL_PLACES + " decimal places):   " + roundUp);

    }
}

答案 1 :(得分:0)

尝试这种方式:

answer = input * input; BigDecimal bg = new BigDecimal(answer); double rs = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

DecimalFormat df = new DecimalFormat("#.00"); double rs = df.format(answer);

使用BigDecimal将始终保持双值的pricise值。