我们在mysql中存储了浮动类型的钱,没有定义精度或比例。我们意识到钱不应该存储为浮点数,而应该使用精度和小数位数。现在我们已经定义了十进制(16,6)来存储相同的值。
现在,当我们从float迁移到十进制时,我们看到了不需要的数字。 例如:从应用程序输入的值为0.45,存储为0.45003456浮点类型。当我们迁移到十进制时,它将被存储为0.450034。
问题:那么,有没有办法检索输入的原始值为0.45?并迁移它。
注意:在应用程序中我们正在使用hibernate,它显示正确的值为0.45而不是0.45003456 [我们在此列的hibernate映射中定义为float]
答案 0 :(得分:0)
不,精度在插入时永久丢失,无法仅使用数据库恢复丢失的信息。
我猜你的ORM会丢失精度,因为你描述的行为在直接操作数据库时没有显示:
CREATE TABLE t_source (
v FLOAT
);
CREATE TABLE t_target (
v DECIMAL(16,6)
);
INSERT INTO t_source VALUE (0.45);
SELECT * FROM t_source; -- result: 0.45
INSERT INTO t_target SELECT * FROM t_source;
ALTER TABLE t_source MODIFY COLUMN v DECIMAL(16,6);
SELECT * FROM t_source; -- result: 0.450000
SELECT * FROM t_target; -- result: 0.450000
由于您的ORM层在从数据库读取时似乎将更改存储的值恢复为原始值,我会尝试通过此ORM转换值。< / p>
注意:DECIMAL
数据库类型应该映射到java.math.BigDecimal
Java类型but I have no idea what I am talking about。以下可能有效,也可能无效。
BigDecimal