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

时间:2018-08-07 12:16:46

标签: java double bigdecimal

由于我要使用可用的舍入模式,因此我尝试使用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

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

编辑:我了解我的简短询问已导致该问题被否决。好像我遇到了编译错误,并立即开始寻求解决方案,事实并非如此。下次我会花时间给予更清晰的阐述。

4 个答案:

答案 0 :(得分:1)

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

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

哪个给出正确的输出123.46。

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

答案 1 :(得分:1)

它失败是因为变量result的类型为double,而BigDecimal上的操作通常会产生BigDecimal类型的值。您不能将BigDecimal放在类型double的变量中。您需要类型为BigDecimal的变量。

错误消息清楚地告诉了您什么,而让您选择忽略它而是来这里询问是值得关注的。

  

我要寻找的结果的值是:

     

123.46

double是达到此目的的相当错误的工具。双打是近似值,您告诉您想要一个非常精确的结果,除了该结果之外,什么都没有。因此,不是近似值。

如果您唯一的目标是显示123.46(由于您拥有数字123.456)并且四舍五入到小数点后两位,则关键字为 display 。用于显示文本的正确工具是字符串,而不是双精度字符。

使用DecimalFormat。

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

System.out.println(s);

不需要BigDecimal。

答案 2 :(得分:0)

BigDecimal::setScale返回BigDecimal而不是double,您必须使用BigDecimal::doubleValue()来获取double值,如下所示:

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

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

答案 3 :(得分:0)

setScale()返回一个BigDecimal,您将其转换为double值,从而导致错误。

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