Postgresql 博士后浮点数学-我需要做什么特别的事情吗?
我是PG的新手,我想知道我是否需要做些额外的事情来正确处理浮点数学 例如,在ruby中使用Postgresql 博士后浮点数学-我需要做什么特别的事情吗?,postgresql,floating-point,decimal,Postgresql,Floating Point,Decimal,我是PG的新手,我想知道我是否需要做些额外的事情来正确处理浮点数学 例如,在ruby中使用BigDecimal,在Elixir中使用Decimal 我下面的是PG的最佳解决方案吗 SELECT COALESCE(SUM(active_service_fees.service_fee * (1::decimal - active_service_fees.withdraw_percentage_discount)), 0) FROM active_service_fees 数据类型: ser
BigDecimal
,在Elixir中使用Decimal
我下面的是PG的最佳解决方案吗
SELECT
COALESCE(SUM(active_service_fees.service_fee * (1::decimal - active_service_fees.withdraw_percentage_discount)), 0)
FROM active_service_fees
数据类型:
service_fee integer NOT NULL
withdraw_percentage_discount numeric(3,2) DEFAULT 0.0 NOT NULL
这取决于你想要什么 如果需要浮点数,则需要使用数据类型
real
或双精度
,具体取决于精度要求
这些浮点数需要固定的空间(4或8字节),以二进制表示形式存储,精度有限
如果需要任意精度,可以使用二进制编码的十进制类型数值
(十进制
是它的同义词)
这些值存储为十进制数字,所需的存储量取决于位数
浮点数的最大优势在于性能——浮点运算在处理器的硬件中实现,而二进制编码小数的运算在PostgreSQL中实现
经验法则是:
- 如果您需要精确到某个小数位数的值(如货币数据),并且不需要进行大量计算,请使用
decimal
- 如果您需要进行数字运算,并且不需要将值四舍五入到固定的精度,请使用
双精度
这取决于你想要什么 如果需要浮点数,则需要使用数据类型
real
或双精度
,具体取决于精度要求
这些浮点数需要固定的空间(4或8字节),以二进制表示形式存储,精度有限
如果需要任意精度,可以使用二进制编码的十进制类型数值
(十进制
是它的同义词)
这些值存储为十进制数字,所需的存储量取决于位数
浮点数的最大优势在于性能——浮点运算在处理器的硬件中实现,而二进制编码小数的运算在PostgreSQL中实现
经验法则是:
- 如果您需要精确到某个小数位数的值(如货币数据),并且不需要进行大量计算,请使用
decimal
- 如果您需要进行数字运算,并且不需要将值四舍五入到固定的精度,请使用
双精度
draw\u percentage\u discount
是一个类似于0.10
的浮点数。这不符合条件吗?提取百分比\u折扣
是数字而不是浮动。检查您不需要转换为十进制。您的数学没有浮点。draw\u percentage\u discount
是一个类似于0.10
的浮点数。这不符合条件吗?提取百分比\u折扣
是数字而不是浮动。检查这是一个非常好的答案,谢谢。因此,只要使用numeric
,基本上浮点数学错误是不可能的,因为它只为符号和指数或任何东西存储了一些额外的位(而使用float则将其压缩到特定的空间量)?如果使用numeric(7,2)
,则会出现大量舍入错误,但那就是你在这种情况下的要求。使用numeric(200100)
比使用双精度
可以获得更好的精度。对于浮点数据类型,您无法配置精度。对不起,我现在有点困惑。因此,如果我将百分比存储为0.10
或1.00
或0.33
表示10%、100%、33%,我想确保我的计算对123*(1-percent)
是准确的,其中123
是任何整数(以美分为单位),我使用数值(3,2)安全吗
对于百分比数据类型?是的,这将是准确的,因为结果只能在小数点分隔符后有两个有效数字。好的,这非常有意义。我还忘了你刚才提到的数字不是在CPU上完成的,是“精确的”,所以这是有意义的。这是一个非常好的答案,谢谢。因此,只要使用numeric
,基本上浮点数学错误是不可能的,因为它只为符号和指数或任何东西存储了一些额外的位(而使用float则将其压缩到特定的空间量)?如果使用numeric(7,2)
,则会出现大量舍入错误,但那就是你在这种情况下的要求。使用numeric(200100)
比使用双精度
可以获得更好的精度。对于浮点数据类型,您无法配置精度。对不起,我现在有点困惑。因此,如果我将百分比存储为0.10
或1.00
或0.33
表示10%、100%、33%,我想确保我的计算对123*(1-percent)
是准确的,其中123
是任何整数(以美分为单位),我使用数值(3,2)安全吗
对于百分比数据类型?是的,这将是准确的,因为结果只能在小数点分隔符后有两个有效数字。好的,这非常有意义。我还忘了你刚才提到的数字不是在CPU上完成的,是“精确的”,所以这是有意义的。