gpt4 book ai didi

mysql - Ruby BigDecimal 和 MySQL 小数精度不匹配

转载 作者:太空宇宙 更新时间:2023-11-03 11:16:22 26 4
gpt4 key购买 nike

我正在使用 Rails 3.0.3 将一些纬度和经度存储在 MySQL 数据库中。这是我用来创建表的迁移的一部分(注意具有给定精度的十进制值):

create_table :dummies do |t|
t.decimal :something, :precision => 13, :scale => 10
end

下面的 RSpec 示例应该说明它哪里出错了。

我使用 BigDecimal 进行一些计算,生成的 my_value 是一个精度较高的数字(大于迁移中指定的精度)。我将对象存储在数据库中并再次检索它。

将原始值与数据库值进行比较失败,因为它们的精度不同,因此不再是相同的数字:

it 'should be equals before and after save' do
my_value = BigDecimal('4.123456789') * 5000 # more precise than defined in the migration
dummy = Dummy.new(:something => my_value)
location.save!
Dummy.first.something.should == dummy.something
end

我明白为什么会发生这种情况(MySQL 中小数的精度!= BigDecimal 的精度)但是谁能告诉我如何在写入之前限制 my_value BigDecimal 的精度数据库以确保它遵守数据库约束?

谢谢!

最佳答案

在 mySQL 中,使用 FLOAT 存储这些地理坐标。将它们存储为高精度小数根本没有意义。请记住,纬度的 1/60 为海里,因此一英尺(约 1/3 米)大约为 3 微度。 (3e-06)

IEEE 单精度 float 的 epsilon(误差)约为 6e-08

GPS 和地理编码不是那么详细,即使您处于 179.9996 度时也是如此。

如果您正在制作非常详细的 200 比例地形图或类似的东西,您可能已经知道您必须使用高精度投影,例如通用横向墨卡托或兰伯特或类似的投影,因为您超出了限制将地球近似为一个球体。但是,如果您正在开发商店搜索类型的应用程序,那么您不需要、不想也无法获得这种精确度。

如果您必须在 Ruby 程序中使用小数,请在存储到 mySQL 之前转换为 float 。

这是 Randall Munroe 对地理坐标精度的解释。

enter image description here

关于mysql - Ruby BigDecimal 和 MySQL 小数精度不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4753801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com