【问题标题】:PostgreSQL calculated column not displaying numbers after decimal and rounding value to 0PostgreSQL计算列不显示小数点后的数字并将值四舍五入为0
【发布时间】:2022-10-20 21:09:57
【问题描述】:

我正在尝试在查询中执行以下计算:

t0.value1::decimal * 10 ^ (-1 * t2.value2::decimal) * t0.value3::decimal as total_value

但是,由于(-1 * t2.value2::decimal) 返回 -18,所有结果都四舍五入为 0。我尝试明确说明十进制小数位数和精度//将其更改为数字但得到相同的输出。 只要(-1 * t2.value2::decimal) 是,它就可以正常工作大于 -10 且小于 10(如果小数位数小于 10).

如何解决?

UPD:这是数据样本

value1 value2 value3
4600000000000000000 18 4631.012195988508
5000000000000000000 18 3273.4212494812623
18 2422.052197425213
25000000000000000000 18 2549.800132829858
9690000000000000000 18 4109.547860742057
5980000000000000000 18 2957.913800830533
4200000000000000000 18 3410.6366004760075
8000000000000000000 18 3902.894047163281
6000000000000000000 18 4604.587023538565

【问题讨论】:

  • 你能提供一些值吗?
  • -18 < 10 但根据您的描述它不起作用。我无法复制:select 10^(-18); 1e-18。您将需要提供一些实际的示例输入数据和输出数据。
  • @DannySlor 添加了一些值,请看一下
  • @AdrianKlaver 更新了描述并提供了一些示例输入数据,请看一下
  • 问题似乎在这里(-1 * t2.value2::decimal) 将其更改为(-1 * t2.value2) 并且它消失了。还不知道为什么。什么版本的 Postgres?

标签: sql database postgresql decimal numeric


【解决方案1】:

10 被解释为小数点,比例为 20。给它更高的精度和比例:

t0.value1::decimal * 10::decimal(40,20) ^ (-1 * t2.value2::decimal) * t0.value3::decimal as total_value

此行为被 PostgreSQL 开发认为是一个错误,并已在 PostgreSQL v16 的this commit 中修复。该修复不会应用于旧版本,以避免“更改查询的风险 产生稳定的分支”。

【讨论】:

  • 1)在哪里记录了 10 具有您需要覆盖的默认限制? 2)为什么select 10^(-1 * 18);从这里给出Math:numeric ^ numeric → numeric或double precision ^ double precision → double precision?
【解决方案2】:

x^(-y) = 1/x^y 并且有效。

select value1::decimal * (1/10 ^(value2::decimal)) * value3::decimal as total_value
from   t
total_value
21302.656101547136800000000000000000000000000000000000
16367.1062474063115000000000000000000000000000000000000
63745.003320746450000000000000000000000000000000000000
39821.518770590532330000000000000000000000000000000000
17688.324528966587340000000000000000000000000000000000
14324.6737219992315000000000000000000000000000000000000
31223.152377306248000000000000000000000000000000000000
27627.522141231390000000000000000000000000000000000000

Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多