Float setter设置任意分数

时间:2014-01-07 10:01:36

标签: java types

这是我" ProjectEntity"中代码的一部分。 class(我用hibernate进行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并乘以浮动" m"这相当于47.6一切都很好,直到这里。它应该将值设置为2427.6而是设置为2427.5999。可能是什么问题?

注意:首先在ProjectEntity"预算"值是double而不是float。我把它变成了漂浮物。但一切都没有改变。

2 个答案:

答案 0 :(得分: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 :(得分:1)

如果您想要准确的浮点计算,请使用BigDecimal类,而不是floatdouble

BigDecimal是表示数字的精确方式。 Double具有一定的精度。使用各种大小的双精度(比如d1 = 1000.0和d2 = 0.001)可能会导致0.001在求和时全部掉落,因为幅度差异很大。使用BigDecimal,这不会发生。

  

BigDecimal类使用户可以完全控制舍入   行为,强制用户明确指定舍入行为   用于能够丢弃精度的操作(divide和setScale)。   为此目的提供了八种舍入模式。

     

两种类型   提供操作来操纵BigDecimal的比例:   缩放/舍入操作和小数点运动操作。

     

缩放/舍入操作(SetScale)返回其值为BigDecimal   大约(或完全)等于操作数的那个,但是它的   scale是指定值;也就是说,他们增加或减少   数字的精确度对其价值的影响很小。

     

十进制   点运动操作(movePointLeft和movePointRight)返回一个   通过移动小数点a从操作数创建的BigDecimal   指定方向的指定距离;也就是说,他们改变了   数字的值不会影响其精确度。