2010-09-30 365 views

回答

-1
new BigDecimal(myfloat) 
+4

没有浮动的构造,这是自动强制转换为双,和双构造函数是不安全的 – Alex 2012-11-08 16:36:22

-2

使用float构造:

float f = 10.0f; 
BigDecimal b = new BigDecimal(f); 
+7

没有浮点构造函数,这是自动转换为双精度,并且双精度构造函数不安全 – Alex 2012-11-08 16:35:42

35
BigDecimal value = new BigDecimal(Float.toString(123.4f)); 

javadocs,字符串构造一般是一个float转换成一个BigDecimal的首选方法,因为它不会从遭受BigDecimal(double)构造函数的不可预测性。从文档

引用:

注意:对于值其他浮点和双精度的NaN和±无穷远,此构造是通过Float.toString(浮点)和Double.toString返回的值兼容(双)。 这通常是将float或double转换为BigDecimal的首选方式,因为它不会受到BigDecimal(double)构造函数的不可预测性的影响。

+4

但是明确地将“float”转换为String并不能帮助您自动解决不可预测性问题 - 您需要注意正确格式化值(四舍五入) TC)。 – Jesper 2010-09-30 08:58:08

8

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

BigDecimal value = new BigDecimal(f, 
     new MathContext(3, RoundingMode.HALF_EVEN)); 
13
float f = 45.6f; 
BigDecimal bd = BigDecimal.valueOf(f); 

引用从单证:

注意:这通常是转换双倍的优选方式(或 浮点数)转换为BigDecimal,因为返回的值等于从构造产生的 从使用 Double.toString(double)的结果中得到一个BigDecimal。

参考:BigDecimal (Java Platform SE 6)

+0

'Double.toString(float)'产生与'Float.toString(float)'不同的结果。 – 2017-01-24 13:12:14

1

这是高达我的知识:

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; 
    } 

} 

*注:这通常是转换一个双(或浮动)转换为BigDecimal,作为首选方式返回的值等于从使用Double.toString(double)的结果构造BigDecimal所产生的值。

公共静态的BigDecimal的valueOf(double val)将

参数
VAL - 双转换为一个BigDecimal。
返回
一个BigDecimal,其值等于或近似等于val的值。
抛出:
NumberFormatException的 - 如果val为无穷大或NaN。
由于:
1.5

我已经检查是否无限大,不是一个数字,所以有NumberFormatException异常的机会少