我正在创建一个3D地图,我有每个点的x,y和z值,我从中获取数据的当前数据库具有如下值:
x = -8.851079259998058e16
y = 4.236944396687888e16
z = -4.451352534647966e16
我试图像这样进行数据库迁移:
class CreateMapPoints < ActiveRecord::Migration
def change
create_table :map_points do |t|
t.float :x
t.float :y
t.float :z
t.timestamps
end
end
end
然而,当我将数据导入这个新表并在rails console
中运行以下内容时,我得到了奇怪的结果:
1.9.2-p290 :002 > MapPoint.first
MapPoint Load (0.6ms) SELECT `map_points`.* FROM `map_points` LIMIT 1
=> #<MapPoint id: 1, x: -88510800000000000.0, y: 42369400000000000.0, z: -44513500000000000.0, created_at: nil, updated_at: nil>
x,y和z缺少第一个数字后的点。有人可以告诉我这里做错了吗?任何帮助将不胜感激。
由于
贝
答案 0 :(得分:1)
从您的问题中不清楚实际问题是什么。您说这些值“缺少第一个数字后的点。”但是,显示的值与输入值大致相同。它们的表现形式不同。该点是显示格式的一个特征,而不是数字的一个特征。例如,“1/2”,“。5”和“5e-1”是相同值的不同表示。事实上,一个人有一个“/”,一个人有一个“。”,一个人有一个“e”这个事实并没有使他们成为不同的数字。
-8.851079259998058e16与-88510800000000000.0大致相同。 (末尾的“e16”表示乘以10 16 。)然而,在第六个有效数字之后,它是不同的。因此,存在这种差异是否真实以及是否存在问题的问题。
这个差异是否真实,我的意思是我想知道字符串“-88510800000000000.0”是否完全显示计算机中的实际值。可能是,在格式化输出时,仅显示前六位有效数字。在某些软件中,默认输出格式可能只显示几个有效数字,并且可以通过对格式设置进行一些修改来显示更多数字。您也可以使用指数格式指定显示,因为您已显示输入值。这将涉及您正在使用的特定软件,我无法进一步建议。
如果值实际已经改变,而不仅仅是显示它,那么您可能需要使用更精确的类型,例如双精度二进制浮点类型或扩展或任意精度十进制类型。同样,替代类型的可用性涉及您正在使用的特定软件,我无法进一步建议。
答案 1 :(得分:0)
您可能需要在迁移中设置精度,如果float不起作用,请尝试使用decimal:
t.decimal :x, :precision => 15
t.decimal :y, :precision => 15
t.decimal :z, :precision => 15