提问人:Luana Maia 提问时间:1/19/2022 更新时间:1/23/2022 访问量:513
将 ruby on rails 中的更改列从 float 迁移到 double 更改更高值
Migrate changing column from float to double changing higher values in ruby on rails
问:
我正在尝试进行迁移,将列类型从 float 更改为 double,因为 float 类型将数据库中的某些值四舍五入,例如:
过帐值:列类型为浮点数的数据库中23337840
值:23337800
过帐值:列类型为浮点型的数据库中23337870
值:3337900
当我运行迁移到双倍时,这些值被更正为正确的值,并且具有适当的精度,但是像 1 万亿这样的值是错误的。
浮点型列中的值:10000000000000
双精度型列中的值:999999995904
注意:如果在数据库中进行新的插入,并且该列为值为 1 万亿的 double 类型,则该值是正确的。仅当值从 float 迁移到 double 时,才会发生该错误。
有谁知道为什么会发生这种情况,因为双精度应该接受更大的值?有什么方法可以使数据库中已有的这些值保持正确?
答:
MySQL 数据库列存储(默认情况下)32 位单精度浮点数。这些值的精度有限,对于非常小或非常大的数字来说,这一点最为明显。例如,这些是最接近 1,000,000,000,000 的可用 32 位浮点值:(有各自的差异)FLOAT
999999799296.0 # -200,704
999999864832.0 # -135,168
999999930368.0 # -69,632
999999995904.0 # -4,096
1000000061440.0 # +61,440
1000000126976.0 # +126,976
1000000192512.0 # +192,512
如果中间有一个值,它将转换为最接近的可用浮点数。尝试将整数 1,000,000,000,000 存储为 32 位浮点数实际上将存储 999,999,995,904.0,因为这是最接近的可用值,“仅”相差 4,096。
可以表示的值是可以表示的值的子集。这意味着将列从 转换为 是一种无损操作。没有进一步的精度损失,其数值不会改变。但是,无法从 32 位浮点数重建原始值,即将 999,999,995,904.0 从 FLOAT 转换为 DOUBLE 仍将是 999,999,995,904.0。FLOAT
DOUBLE
FLOAT
DOUBLE
将新值存储到 DOUBLE 列中确实受益于更高的精度。这就是为什么您的列中可以有 1,000,000,000,000.0 的原因。DOUBLE
请注意,现在 Ruby 中的浮点数是 64 位的,即 Ruby 的浮点数对应于 MySQL 的浮点数。Float
DOUBLE
评论