这是我" 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。我把它变成了漂浮物。但一切都没有改变。
答案 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类,而不是float
或double
。
BigDecimal
是表示数字的精确方式。 Double
具有一定的精度。使用各种大小的双精度(比如d1 = 1000.0和d2 = 0.001)可能会导致0.001在求和时全部掉落,因为幅度差异很大。使用BigDecimal,这不会发生。
BigDecimal
类使用户可以完全控制舍入 行为,强制用户明确指定舍入行为 用于能够丢弃精度的操作(divide和setScale)。 为此目的提供了八种舍入模式。两种类型 提供操作来操纵
BigDecimal
的比例: 缩放/舍入操作和小数点运动操作。缩放/舍入操作(SetScale)返回其值为BigDecimal 大约(或完全)等于操作数的那个,但是它的 scale是指定值;也就是说,他们增加或减少 数字的精确度对其价值的影响很小。
十进制 点运动操作(movePointLeft和movePointRight)返回一个 通过移动小数点a从操作数创建的BigDecimal 指定方向的指定距离;也就是说,他们改变了 数字的值不会影响其精确度。