如何防止PostgreSQL中的精度溢出?

时间:2013-06-27 10:01:38

标签: sql postgresql

我在PostgreSQL中有一个表定义为:

CREATE TABLE ITEM_PROPERTIES
( 
  ITEM_ID NUMERIC(11,0),
  ITEM_DIMENSIONAL_UOM VARCHAR(30),
  ITEM_HEIGHT NUMERIC(38,14),
  ITEM_WIDTH NUMERIC(38,14),
  ITEM_LENGTH NUMERIC(38,14),
  ITEM_WEIGHT_UOM VARCHAR(30),
  ITEM_WEIGHT NUMERIC(38,14),
  ITEM_CUBE NUMERIC(38,14)
);

项目的长度/宽度/高度存储在表格中,我需要通过以下SQL计算多维数据集:

update ITEM_PROPERTIES set ITEM_CUBE = ITEM_WIDTH*ITEM_HEIGHT*ITEM_LENGTH
where ITEM_WIDTH<10000 and ITEM_HEIGHT < 10000 and ITEM_LENGTH<10000;

然后我遇到精度溢出:

ERROR: Resulting scale overflows maximum precision

如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

最后,这个SQL有效:

update ITEM_PROPERTIES set ITEM_CUBE = ITEM_WIDTH::decimal(12,3)*ITEM_HEIGHT::decimal(12,3)*ITEM_LENGTH::decimal(12,3)
where ITEM_WIDTH<10000 and ITEM_HEIGHT < 10000 and ITEM_LENGTH<10000;

答案 1 :(得分:0)

可能使用truncation

update ITEM_PROPERTIES set ITEM_CUBE = trunc(ITEM_WIDTH*ITEM_HEIGHT*ITEM_LENGTH, 14)
where
     ITEM_WIDTH<10000
     and ITEM_HEIGHT < 10000
     and ITEM_LENGTH<10000;

答案 2 :(得分:0)

您可以尝试将其四舍五入到该顺序。

但真正的问题源于你的类型。如果长度,宽度和高度为numeric(38,14),则卷应更像numeric(114,42)。事实上,在尺度和精度都用在三维空间的情况下,可以容纳更多的载体。

恕我直言,完全摆脱精确度和比例:将数字存储为numeric而不是numeric(38,14),并避免首先出现问题。 (如果确实需要14位小数,请在应用程序中使用或使用之前的触发器进行舍入。)