由于我要使用可用的舍入模式,因此我尝试使用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
请帮助我了解如何更正此问题。
编辑:我了解我的简短询问已导致该问题被否决。好像我遇到了编译错误,并立即开始寻求解决方案,事实并非如此。下次我会花时间给予更清晰的阐述。
答案 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)