【问题标题】:Is it possible to get up to 3 decimal places in Float in PostgreSQL?PostgreSQL 中的浮点数最多可以保留 3 位小数吗?
【发布时间】:2021-07-14 10:53:00
【问题描述】:

我在 PostgreSQL 中有一个表,它有一个 Float 列。在我的选择中,我在该列上使用 AVG(),因此它通常给出一个带有许多小数的数字。有没有办法将小数位数限制为最多 3 位,这意味着可以少但不超过 3。

这是查询:

SELECT team, AVG(score) FROM team_score_table GROUP BY team

【问题讨论】:

  • 您要格式化结果以供显示还是要对四舍五入的结果进行进一步计算?

标签: sql postgresql average


【解决方案1】:

您可以使用几个函数来做到这一点:

SELECT round(42.43666, 2) -- 42.44

SELECT trunc(42.43666, 2) -- 42.43

或演员:

SELECT cast(42.43666 as numeric(20, 2)) -- 42.44

根据你的例子应该是:

SELECT team, round(AVG(score)::numeric, 2) FROM team_score_table GROUP BY team

SELECT team, trunc(AVG(score)::numeric, 2) FROM team_score_table GROUP BY team

SELECT team, cast(AVG(score) as numeric(20,2)) FROM team_score_table GROUP BY team

【讨论】:

  • 我已经尝试过强制转换,它返回 20 位小数
  • 我已经为你的例子添加了解决方案。
  • @Ben:只要你坚持使用float,就没有办法摆脱小数点。您只能使用numeric 做到这一点。或者在 显示 值时按照您想要的方式格式化您的 float
  • @a_horse_with_no_name 好吧,很公平。谢谢!
【解决方案2】:

你可以使用round():

select round(val::numeric, 3)

您也可以转换为数字,但需要适合您的值的精度:

select val::numeric(20, 3)

我实际上更喜欢显式的cast(),因为它将列的数据类型设置为具有显式比例的numeric——因此下游应用程序知道结果中的小数位数。

round() 返回一个 numeric 值,但它是一个“通用”数字,没有指定的比例和精度。

你可以看到this example的区别。

【讨论】:

  • 第一个建议不起作用:错误:函数round(双精度,整数)不存在。我不确定你可以在 PostgreSQL 中做到这一点。我不想转换数据类型,如果可能的话,我希望它是一个浮点数。
猜你喜欢
  • 2018-06-16
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 2019-11-15
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
相关资源
最近更新 更多