BigDecimal 方法调用导致编译时错误

BigDecimal method call causes compile time error

我正在尝试使用 BigDecimal 格式化和保存双精度数,因为我想使用它可用的舍入模式。然而,此代码会导致编译错误:

import java.math.*;

public class Format {

    public static void main (String[] args) {

        double result = 123.456;
        int decimalPlaces = 2;

        result = BigDecimal.valueOf(result).setScale(decimalPlaces, RoundingMode.HALF_UP);
        System.out.println(result);
    }
}

遇到的错误:

Format.java:10: error: incompatible types: BigDecimal cannot be converted to double
        result = BigDecimal.valueOf(result).setScale(decimalPlaces, RoundingMode.HALF_UP);

我要查找的结果值为:

123.46

请帮助我了解如何更正此问题。

编辑:我知道我提出问题的简洁性导致问题被否决。好像遇到了编译错误,立马来求解决方法,其实不是这样。下次我会花时间给出更清楚的说明。

BigDecimal::setScale return BigDecimal not a double, You have to use BigDecimal::doubleValue() 获取双精度值,像这样:

result = BigDecimal.valueOf(result)
        .setScale(decimalPlaces, RoundingMode.HALF_UP)
        .doubleValue();

System.out.println(result);// 123.46

这可能太明显了,但是您不能将 double 分配给 BigDecimal

BigDecimal decimal = BigDecimal.valueOf(result)
    .setScale(decimalPlaces, RoundingMode.HALF_UP);
System.out.println(decimal);

这给出了 123.46 的正确输出。

如果您想要 double,请使用 BigDecimal.doubleValue()

setScale() returns 一个 BigDecimal,您将其转换为 double,因此出现错误。

https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#setScale(int)

失败是因为您的变量 resultdouble 类型,而对 BigDecimal 的操作通常会产生 BigDecimal 类型的值。您不能将 BigDecimal 放入 double 类型的变量中。您需要一个 BigDecimal 类型的变量。

错误信息已经很清楚地告诉你了,你选择忽略它来这里问是相当令人担忧的。

The value of result I am looking for is:

123.46

A double 是一个相当错误的工具。双打是近似值,你说你想要一个非常精确的结果,除了那个结果别无其他。因此,不是近似值。

如果您的唯一目标是显示 123.46 作为您拥有的数字 123.456 并且四舍五入到两位小数的结果,那么关键字是 display .显示文本的正确工具是 String,而不是 double。

使用小数格式。

NumberFormat format = new DecimalFormat("0.00");
String s = format.format(result);

System.out.println(s);

不需要 BigDecimal。