Postgresql 博士后浮点数学-我需要做什么特别的事情吗?

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

我是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
数据类型:

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上完成的,是“精确的”,所以这是有意义的。