我需要在我的数据库中存储价格。我正在使用JPA,所以我有一个这样的模型:
@Entity
@Table(name="products")
public class Product {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;
@Column(name="price")
private float price;
}
问题在于,当我用“4.20”这样的值填写价格表单输入时,在我的Oracle数据库中,我得到“4.2”,失去了尾随零。
我该如何解决这个问题?
编辑:由于我正在使用JPA,因此我必须避免在本机Oracle方言中编写查询。要存储产品(及其价格),我只需编写类似em.persist(product)
的内容,其中em是EntityManager
答案 0 :(得分:6)
你无法解决它,我建议这不是问题。这就是Oracle如何存储NUMBER
值:所需的精度最低。如果您输入的价格为4.00
,则会将其存储为4
。
请注意,在显示值时,Java不会默认为两位小数。您需要指定小数位数。
如果可能的话,我会使用BigDecimal
代替float
来代价。 float
类型不准确。另一种方法是使用整数类型之一(int
或long
)并自己管理小数位。
要格式化Java代码中显示的价格,请使用String.format("%.2f", price)
。
要格式化Oracle查询中的价格,请使用TO_CHAR
:
SELECT TO_CHAR(price, '999999990.00'), etc.
选择最适合您的占位符数,并注意Oracle会在结果的开头添加额外的空格。如果数字是负数,则意味着保持减号,但对于零/正数,这是一个空格。要摆脱空间,请使用FM
中的TO_CHAR
修饰符:
SELECT TO_CHAR(price, 'FM999999990.00'), etc.