如何在Java中将浮点数转换为BigDecimal?

59

如何在Java中将float转换为BigDecimal?

4个回答

74
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)构造器那样不可预测。


8
将浮点数(float)显式转换为字符串并不能自动解决不可预测性的问题——你需要注意正确地格式化该值(舍入等)。 - Jesper
如何将9.991f转换为910并格式化,以及将9.99f转换为9.99? - Jobin
请参见:https://docs.oracle.com/javase/8/docs/api/java/lang/Float.html#toString-float- - Josue Abarca

29
float f = 45.6f;
BigDecimal bd = BigDecimal.valueOf(f);

文档中的引用:

注意:这通常是将double(或float)转换为BigDecimal的首选方法,因为返回的值等于使用Double.toString(double)的结果构造BigDecimal的结果。

参考资料:BigDecimal (Java 平台 SE 6)


5
Double.toString(float) 产生的结果与 Float.toString(float) 不同。 - Lakatos Gyula
4
BigDecimal.valueOf( 1.1f ) results in 1.100000023841858 - cdalxndr
警告:在BigDecimal中,45.6f将变为45.599998474121094。如果您不希望出现这种情况,请参考另一个答案。 - undefined

9

对于小数点后3位的精度:

BigDecimal value = new BigDecimal(f,
        new MathContext(3, RoundingMode.HALF_EVEN));

如何将9.991f转换为910并格式化,以及将9.99f转换为9.99? - Jobin
@Jobin,我不明白你的问题。为什么9.991f会转换成910?你是指10而不是910吗?如果是这样,你需要使用new MathContext(2, RoundingMode.UP)new MathContext(2, RoundingMode.CEILING),具体取决于你如何处理负数。 - Maurice Perry

3
这是我所知道的:

这是我所了解的:

   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的可能性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接