Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 模拟postgres中的固定点数?_Sql_Postgresql_Fixed Point - Fatal编程技术网

Sql 模拟postgres中的固定点数?

Sql 模拟postgres中的固定点数?,sql,postgresql,fixed-point,Sql,Postgresql,Fixed Point,我想对一个表使用固定点数,总是小数点后3位。我有这样一个示例表: create table coordinates (id serial, x integer, y integer, z integer); 这将有数十万行,但在加载初始数据集后可能不会经常插入/更新。但是在每一个使用它的地方,要计算每一个数字除以一千,这将是一件痛苦的事情。我突然想到,一个视图可能是合适的: create view coordinates_adjusted as select id, x/1000::rea

我想对一个表使用固定点数,总是小数点后3位。我有这样一个示例表:

create table coordinates (id serial, x integer, y integer, z integer);
这将有数十万行,但在加载初始数据集后可能不会经常插入/更新。但是在每一个使用它的地方,要计算每一个数字除以一千,这将是一件痛苦的事情。我突然想到,一个视图可能是合适的:

create view coordinates_adjusted as 
 select id, x/1000::real as x, y/1000::real as y, z/1000::real as z 
   from coordinates;
当然,这是可以预期的,我也不认为会有任何性能问题

是否有方法使用固定点编号插入/更新此视图,以便在插入/更新到基础表之前将其乘以1000?Postgres似乎支持在视图中插入,但不支持视图复杂的情况。虽然我不会经常更新,但它仍然会发生,所以我希望在整个项目中保持一致


对这些列使用数字/小数是否更好?如果我这样做,会出现什么样的性能问题?我不需要接近这个精度水平,我希望我的数据都能在有符号的4字节值范围内很好地拟合。我不需要超过3的刻度,也不需要超过13的精度。但是,由于这些值是坐标,我将在数学中大量使用这些值。

如果需要具有三个小数点的定点值,请将列定义为


这就是
numeric
的用途。当您的数据存在内置机制时,不要开始尝试使用其他类型。

如果您想要具有三个小数点的定点值,请将列定义为

这就是
numeric
的用途。当您的数据存在内置机制时,不要开始尝试使用其他类型。

您有两个选择:

  • 通篇使用
    数字(10,3)
    以便于编码并避免舍入错误

  • 使用
    integer
    bigint
    可以提高处理速度,但代价是方便和可读性

  • 在第二种情况下,使用带有
    触发器而不是
    触发器的视图来修改数据是一种提高方便性的方法(但使用
    双精度
    ,而不是
    实数
    ),但在整数和浮点数之间的转换过程中要注意潜在的舍入问题。

    您有两种选择:

  • 通篇使用
    数字(10,3)
    以便于编码并避免舍入错误

  • 使用
    integer
    bigint
    可以提高处理速度,但代价是方便和可读性


  • 在第二种情况下,使用带有
    而不是
    触发器的视图来修改数据是一种提高方便性的方法(但使用
    双精度
    ,而不是
    实值
    ),但要注意整数和浮点数之间转换过程中可能出现的舍入问题

    “但不适用于视图复杂的情况”-您需要为此编写一个
    而不是
    。@a_horse_和_no_name谢谢,我会用谷歌搜索一下。”但不适用于视图复杂的情况“-你需要写一个
    而不是
    。@一个没有名字的马谢谢你,我会用谷歌搜索一下。数字表示任意精度。当你必须绝对确定你没有得到舍入误差。我不相信这是他们打算使用的用例。也许我错了。@JohnO<代码>数值
    没有精度或刻度是一种特殊情况
    numeric()
    /
    decimal()
    用于保存固定精度的数字。numeric用于任意精度。当你必须绝对确定你没有得到舍入误差。我不相信这是他们打算使用的用例。也许我错了。@JohnO<代码>数值
    没有精度或刻度是一种特殊情况
    numeric()
    /
    decimal()
    设计用于保存固定精度的数字。