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)
失败是因为您的变量 result
是 double
类型,而对 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。
我正在尝试使用 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)
失败是因为您的变量 result
是 double
类型,而对 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。