Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL:当将整数强制转换为非整数类型以强制PostgreSQL中的浮点除法时,我应该使用哪种数字类型?_Postgresql_Casting_Integer_Precision_Division - Fatal编程技术网

PostgreSQL:当将整数强制转换为非整数类型以强制PostgreSQL中的浮点除法时,我应该使用哪种数字类型?

PostgreSQL:当将整数强制转换为非整数类型以强制PostgreSQL中的浮点除法时,我应该使用哪种数字类型?,postgresql,casting,integer,precision,division,Postgresql,Casting,Integer,Precision,Division,我知道StackOverflow上有很多整数除法问题,但我没有看到这个问题 与许多编程语言类似,如果两个操作数都是整数,PostgreSQL将执行整数除法 如有: 选择s.id作为学生id, COUNTDISTINCTbc.book\u id/COUNTc.id作为每类图书的平均值 来自学生 左连接c类 在c.student_id=s.id上 左连接书_类bc 在bc.class_id=c.id上 按s.id分组 然后,为了得到想要的结果,必须将COUNTDISTINCTbc.book_id强制

我知道StackOverflow上有很多整数除法问题,但我没有看到这个问题

与许多编程语言类似,如果两个操作数都是整数,PostgreSQL将执行整数除法

如有:

选择s.id作为学生id, COUNTDISTINCTbc.book\u id/COUNTc.id作为每类图书的平均值 来自学生 左连接c类 在c.student_id=s.id上 左连接书_类bc 在bc.class_id=c.id上 按s.id分组 然后,为了得到想要的结果,必须将COUNTDISTINCTbc.book_id强制转换为非整数类型。如果一个人不这样做,那么Postgres,类似于许多编程语言,会进行整数除法,这不太可能给出一个人想要的结果

Postgres支持两种语法来进行此转换:

CAST( value AS type )
例如:

CAST( COUNT(DISTINCT(bc.book_id)) AS DOUBLE PRECISION )
COUNT(DISTINCT(bc.book_id))::decimal
它还支持以下语法:

value::type
例如:

CAST( COUNT(DISTINCT(bc.book_id)) AS DOUBLE PRECISION )
COUNT(DISTINCT(bc.book_id))::decimal
这两种语法都有效,我个人更喜欢使用CAST,因为它更显式,我认为显式是好的。其他人可能更喜欢value::type,因为它表达力强但简洁——更短的通常会更好

我的问题是关于要使用的数字类型

在将COUNTDISTINCTbc.book_id强制转换为非整数类型时,Postgres提供以下类型:

十进制的 数字的 真实的 双精度 在我的查询中,我选择了双精度

我想知道,特别是在除法的情况下,但在任何其他情况下,可能需要将PostgreSQL中的整数类型转换为非整数类型,这四种选择中哪一种是最好的,为什么?

十进制和数字是同义词,所以少了一种选择

如果您需要非常高的精度,请使用不带任何类型修饰符的数值,或者如果您希望四舍五入到一定数量的小数点位置,请使用数值20,2表示两个小数点位置,这是合适的类型

这种数据类型是精确的,但速度较慢,因为它是“二进制编码的十进制”类型

实数和双精度是4字节和8字节浮点数,速度快,但有舍入误差,精度有限

不要用真的,它的精度很低

在大多数实际应用中,您使用剩下的两种类型中的哪一种用于特定目的并不重要

使用CAST语法的优点是它符合标准

备注:DISTINCTcol在语法上是正确的,但具有误导性,因为它不是一个函数。改为写不同的col