Sql 模拟postgres中的固定点数?
我想对一个表使用固定点数,总是小数点后3位。我有这样一个示例表: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
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()
设计用于保存固定精度的数字。