0

我读过其他一些帖子,它们似乎对其他人有用,但是当我尝试它们时,它们不起作用。我刚开始学习 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);

但它似乎不起作用。

4

2 回答 2

1

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

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

但是由于 Java 为定点数学 ( BigDecimal ) 提供了一个很好的即用型类,您可以尝试一下。看看这个小示例代码片段。您可以从几种不同的舍入模式中进行选择,并确定您想要的小数位数。

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);

    }
}
于 2013-10-05T15:41:06.770 回答
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 将始终保持双精度值的价格。

于 2013-10-05T15:10:22.567 回答