如何在Java中将float转换为BigDecimal?
BigDecimal value = new BigDecimal(Float.toString(123.4f));
根据Java文档,使用字符串构造器通常是将float
转换为BigDecimal的首选方式,因为它不会像BigDecimal(double)
构造器那样不可预测。
文档中的引文如下:
注意:对于除了float和double的NaN和±Infinity之外的值,此构造函数与由Float.toString(float)和Double.toString(double)返回的值兼容。这通常是将float或double转换为BigDecimal的首选方式,因为它不会像BigDecimal(double)构造器那样不可预测。
float f = 45.6f;
BigDecimal bd = BigDecimal.valueOf(f);
文档中的引用:
注意:这通常是将double(或float)转换为BigDecimal的首选方法,因为返回的值等于使用Double.toString(double)的结果构造BigDecimal的结果。
Double.toString(float)
产生的结果与 Float.toString(float)
不同。 - Lakatos GyulaBigDecimal.valueOf( 1.1f )
results in 1.100000023841858
- cdalxndrBigDecimal
中,45.6f
将变为45.599998474121094
。如果您不希望出现这种情况,请参考另一个答案。 - undefined对于小数点后3位的精度:
BigDecimal value = new BigDecimal(f,
new MathContext(3, RoundingMode.HALF_EVEN));
new MathContext(2, RoundingMode.UP)
或new MathContext(2, RoundingMode.CEILING)
,具体取决于你如何处理负数。 - Maurice Perry这是我所了解的:
public static BigDecimal floatToBigDecimal(Float a){
if(a == null || a.isInfinite() || a.isNaN()){
return BigDecimal.ZERO;
}
try{
return BigDecimal.valueOf(a);
}catch(Exception e){
return BigDecimal.ZERO;
}
}
*注意:这通常是将double(或float)转换为BigDecimal的首选方法,因为返回的值等于使用Double.toString(double)的结果构造BigDecimal的结果。
public static BigDecimal valueOf(double val)
参数:
val - 要转换为BigDecimal的double。
返回值:
一个BigDecimal,其值等于或近似于val的值。
抛出异常:
NumberFormatException - 如果val是无穷大或NaN。
自从:
1.5
我已经检查过是否为“无穷大”或“非数字”,以减少NumberFormatException的可能性。
float
)显式转换为字符串并不能自动解决不可预测性的问题——你需要注意正确地格式化该值(舍入等)。 - Jesper