PostgreSQL:当将整数强制转换为非整数类型以强制PostgreSQL中的浮点除法时,我应该使用哪种数字类型?
我知道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支持两种语法来进行此转换: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强制
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