2014-01-07 20 views
0

這是代碼的一部分,我的「ProjectEntity」級(這裏我就與休眠的SQL調用)浮動設置器任意分數

@Column(name = "BUDGET") 
private float budget; 

public float getBudget() { 
return budget; 
} 

public float setBudget(float budget) { 
this.budget = budget; 
} 

從另一個類我打電話給我的二傳手是這樣的:

newProject.setBudget(Float.parseFloat(strTotalAmount.substring(0, strTotalAmount.indexOf(" (hrs)"))) * m); 

在這裏我有一個名爲strTotalAmount的字符串,它看起來像這樣:「51.0(小時)」。所以它基本上從字符串獲得51.0的值,並且乘以等於47.6的浮點「m」。一切都很好,直到這裏。它應該將值設置爲2427.6而是將其設置爲2427.5999。可能是什麼問題?

注意:首先,在ProjectEntity「預算」值的兩倍,而不是浮動。我已將其更改爲浮動。但沒有任何變化。

回答

1

浮動在Java近似,如果您需要確切的數字,用錢的工作尤其是當使用BigDecimal

public class FloatTest { 
    public static void main(String[] args) { 
     BigDecimal f1 = new BigDecimal("51.0"); 
     BigDecimal f2 = new BigDecimal("47.6"); 

     System.out.println(f1.multiply(f2)); 
    } 
} 
1

如果你想準確的浮點運算,然後用它代替floatdoubleBigDecimal類。

A BigDecimal是表示數字的確切方式。 A Double具有一定的精度。有不同程度的雙打(比如D1 = 1000.0和d2 = 0.001)可能導致0.001工作總結時,作爲大小的差別是如此之大,而產品總數下降。通過BigDecimal,這不會發生。

BigDecimal類給出了四捨五入 行爲,迫使用戶顯式地指定能夠捨棄部分精度(除法和setScale)的操作的舍入行爲 其用戶完全控制。 爲此提供了八種舍入模式。

提供兩種類型的 操作用於操縱縮放/舍入操作和小數點運動操作的縮放比例。

縮放/舍入操作(SetScale)返回一個BigDecimal,其值 大約(或準確)等於操作數的大小,但其 比例是指定的值;也就是說,它們會增加或它的值最小的影響減小 精度的數量。

十進制 點運動操作(movePointLeft和movePointRight)通過移動小數點在指定方向上的 指定距離返回從操作數創建的 的BigDecimal;也就是說,他們在不影響其精度的情況下更改數字的值。