0

我正在创建一个 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 缺少第一个数字后的点。有人可以建议我在这里做错了什么吗?任何帮助,将不胜感激。

谢谢

托尼

4

2 回答 2

1

从您的问题中不清楚实际问题是什么。您说这些值“在第一个数字之后丢失了点”。但是,显示的值与输入值大致相同。它们只是表示方式不同。点是显示格式的特征,而不是数字的特征。例如,“1/2”、“.5”和“5e-1”是相同值的不同表示。一个有“/”,一个有一个“.”,一个有一个“e”这一事实并没有使它们成为不同的数字。

-8.851079259998058e16 与 -88510800000000000.0 大致相同。(末尾的“e16”表示乘以 10 16。)但是,在第六位有效数字之后是不同的。因此,存在这种差异是否真实以及是否存在问题的问题。

通过这种差异是否真实,我的意思是我想知道字符串“-88510800000000000.0”是否完全显示了计算机中的实际值。可能是在格式化输出时,只显示了前六位有效数字。在某些软件中,默认输出格式可能只显示几个有效数字,并且可以通过对格式设置进行一些修改来显示更多数字。您还可以使用指数格式指定显示,因为您已经显示了输入值。这将涉及您正在使用的特定软件,对此我无法提供进一步的建议。

如果值实际上发生了变化,而不仅仅是它的显示,那么您可能需要使用更精确的类型,例如双精度二进制浮点类型或扩展或任意精度十进制类型。同样,替代类型的可用性涉及您正在使用的特定软件,我无法提供进一步的建议。

于 2012-07-26T11:55:52.050 回答
0

您可能需要在迁移中设置精度,如果浮点数不起作用,请尝试十进制:

t.decimal :x, :precision => 15
t.decimal :y, :precision => 15
t.decimal :z, :precision => 15
于 2012-07-25T23:47:04.820 回答