当前位置: 首页 > 知识库问答 >
问题:

这是在SQL中强制转换、舍入和平均对象的正确方法吗?

酆出野
2023-03-14

问题

如何使用avground在PostgreSQL中提供小数点?

将字符串转换为十进制数需要什么函数?

使用的功能

第1功能

AVG(ratings.dating) AS scent_avg

第一个错误

Error: expected { scents_id: 1, scent_avg: 4.5 } response body, got { scents_id: 1, scent_avg: '4.5000000000000000' }

第二功能

ROUND(AVG(ratings.rating), 1) AS scent_avg

第二个错误

Error: expected { scents_id: 1, scent_avg: 4.5 } response body, got { scents_id: 1, scent_avg: '4.5' }

第三功能

什么函数用于将字符串转换为数字?

编辑

看起来我有一个精神失误。粘位澄清说int没有小数!我从原来的帖子中删除了int位。

共有2个答案

白星海
2023-03-14

在大多数数据库中,这应该可以做到:

cast(avg(ratings.ratio * 1.0) as decimal(4, 1))

我看不到任何舍入4.5是数学上讲的45的平均值。

笪涛
2023-03-14

使用to_char()获得一个格式化字符串,该字符串没有不重要的零(或填充空格)-“四舍五入到小数点后十位”,如您所述:

SELECT to_char(round(avg(ratings.rating), 10), 'FM999999999990.9999999999')

注意一个0。通常,在任何情况下,您都希望获得该职位。类似于0.3。添加您希望允许的位数的9。手册:

0指定始终打印的数字位置,即使它包含前导/尾随零<代码>9也指定了一个数字位置,但如果它是前导零,则它将被一个空格替换,而如果它是尾随零,并且指定了填充模式,则它将被删除。

关于FM前缀:

填充模式(抑制前导零和填充空白)

强制转换为双精度(float8),以获得一个没有不重要的尾随零的数值。演员会删去无关紧要的零。通常,转换为浮点数会导致角点舍入错误。

我首先提出了更复杂的解决方案,但由于您只对小数点后十位以内的精度感兴趣,并且float8的精度高达15个小数位数,因此该问题不适用。手册:

在所有当前支持的平台上,real类型的范围约为1E-37至1E 37,精度至少为6位小数。双精度类型的范围约为1E-307至1E 308,精度至少为15位。值太大或太小将导致错误。如果输入数字的精度太高,可能会发生舍入。如果数字太接近零且无法表示为与零不同,则会导致下溢错误。

所以只要:

SELECT round(avg(ratings.rating), 10)::float8

请注意,我们在四舍五入后进行强制转换,因为接受小数位数的变量round()仅适用于数值(由于浮点数的内部存储不精确)。

在Postgres内部,你不会太担心那些尾随的零。手册:

数字值的物理存储没有任何额外的前导或尾随零。因此,列的声明精度和规模是最大值,而不是固定分配。(在这个意义上,数字类型更类似于varchar(n)而不是char(n)。)实际的存储要求是每组四个十进制数字需要两个字节,外加三到八个字节的开销。

见:

  • PostgreSQL将尾随零添加到数值

在Postgres内部,平等被正确地确立:

SELECT numeric '4.50000000' = numeric '4.5'  -- true
SELECT jsonb '{"scents_id": 4.5}' = jsonb '{"scents_id": 4.5000}'  -- true

抛出错误的客户机似乎比较了文本表示,这是非常不正确的。因此,您可能必须按照客户的期望设置格式。。。

 类似资料:
  • 服务器将MyEJB企业bean的xxx.interfaces.MyLocal接口绑定在xxx-ear应用程序的xxx-ejb.jar模块中。绑定位置为:java:global/xxx/myejb!xxx.interfaces.mylocal 然后我有了一个web应用程序(ear),它为先前启动的ejb-service提供了一个服务提供者(带有@produces),它将为应用程序的其余部分提供可注入

  • 问题内容: 我是Hibernate的新手,并且正在编写一个简单的方法来返回与特定过滤器匹配的对象列表。似乎是自然的回报类型。 不管我做什么,除非聘用了丑陋的人,否则似乎都无法使编译器满意。 我想摆脱它。但是如果我这样做,我会得到警告 (我可以忽略它,但是我不想一开始就得到它),如果我删除泛型以符合返回类型,则会收到警告 我注意到 确实 声明了;但这是完全不同的类型- 返回a 作为原始类型。我发现最

  • 明确的强制转换 明确的 强制转换指的是明显且明确的类型转换。对于大多数开发者来说,有很多类型转换的用法可以清楚地归类于这种 明确的 强制转换。 我们在这里的目标是,在我们的代码中指明一些模式,在这些模式中我们可以清楚明白地将一个值从一种类型转换至另一种类型,以确保不给未来将读到这段代码的开发者留下任何坑。我们越明确,后来的人就越容易读懂我们的代码,也不必费太多的力气去理解我们的意图。 关于 明确的

  • 我有JSON文件看起来像 所以这个键是一个字符串“SUBS_ID”,这个值是一个名为Feature细节的模型,它包含属性“特性设置名称、特性名称、...”。所以我用这样google.json库从JSON文件中读取, 然后我试图循环这个HashMap获取值,并将其转换为我的Feature细节模型, 这是我的FeatureDetails模型, 但我得到了一个例外"com.google.gson.int

  • 我在一个扩展的asynctask中得到了这个错误,但我确信Object[]是一个void[]。 这是我的自定义AsyncTask: 我是这样叫execute的:

  • 问题内容: 我正在尝试序列化对象并通过HTTP发送它。我正在使用一些教程,因为大多数教程都是关于套接字的,但是我不能为此使用套接字,也不能将文件存储在本地。 这是测试类Employee: 客户端: 我认为那是正确的。但是我被困在服务器端,我在服务器端也有employee类: 如何将此对象变回员工类对象? 任何帮助表示赞赏! 问题答案: 只是打字。