2013-11-02 93 views
2

我用下面的代碼,kBigDecimal如何將Apfloat轉換爲BigDecimal?

Apfloat power = ApfloatMath.pow(new Apfloat(-1), new Apfloat(k)); 

Apfloat似乎有像intValue()doubleValue()floatValue()方法,但我看不出我可以轉換ApfloatBigDecimal

+0

哦,我忘了提及的文檔是:http://www.apfloat.org/apfloat_java/docs/org/apfloat/Apfloat.html – user2948708

+0

這樣做的唯一微不足道的方法,我可以找到轉換Apfloat (因爲它是'Formattable'),然後從該字符串構造一個新的'BigDecimal'。不知道你得到的字符串是否可用。 – 2013-11-02 23:35:25

回答

1

BigDecimals最好由字符串或使用BigDecimal.valueOf(double)靜態構造函數生成。

針對您的特殊要求,先從以下內容:

public static asBigDecimal (Apfloat val) { 
    return BigDecimal.valueOf(val.doubleValue()); 
} 

調用new BigDecimal(double)是特別要避免,因爲它產生的浮點位&可以在一定程度不可預知需要廣大確切十進制表示的十進制數字來做到這一點。

另一方面,BigDecimal.valueOf(double)Double.toString(double)具有特定的邏輯來表示雙精度 - >十進制,沒有僞深度十進制。

請參見:

  • java.math.BigDecimal.BigDecimal(double)

從的Javadoc引用:

此構造方法的結果有一定的不可預知的。 人們可能會認爲寫new BigDecimal(0.1)在 爪哇創建BigDecimal這正好等於 0.1(1未測量的值,爲1的標度),但它是 實際上等於0.1000000000000000055511151231257827021181583404541015625。 這是因爲0.1不能完全表示爲 double(或者,就此而言,作爲任何有限長度的二進制分數的 )。因此,正在向構造函數傳遞 ,的值並不完全等於0.1, 出現。

相關問題