2017-04-03 2 views
0

저는 PG에 익숙하지 않고 부동 소수점 연산을 제대로 처리하기 위해 '무엇이든 할'필요가 있는지 궁금합니다.Postgres 부동 소수점 수학 - 특별한 작업이 필요합니까?

예를 들어 루비에서는 BigDecimal을 사용하고 엘 릭시에서는 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 
+0

10 진수로 캐스트하지 않아도됩니다. –

+0

수학에 부동 소수점이 없습니다. –

+0

'withdraw_percentage_discount'는'0.10'과 같은 부동 소수점 숫자입니다. 자격이되지 않습니까? – Tallboy

답변

1

그것은 당신이 원하는에 따라 달라집니다.

당신은 당신이 당신의 정확한 요구 사항에 따라, 데이터 유형 real 또는 double precision을 사용할 필요가부동 소수점 숫자를합니다.

이 부동 소수점 숫자는 고정 된 공간 (4 또는 8 바이트)을 필요로하며 이진 표현으로 저장되며 정밀도가 제한적입니다. 당신은 임의의 정밀도를 원하는 경우

, 당신은 이진화 십진법 유형 numeric을 (decimal는 동의어입니다)를 사용할 수 있습니다.

이러한 값은 10 진수로 저장되며 필요한 저장 공간은 자릿수에 따라 다릅니다.

부동 소수점 숫자의 가장 큰 장점은 프로세서의 하드웨어에 부동 소수점 연산이 구현되는 반면, 이진 코드 소수 자릿수는 PostgreSQL에서 구현됩니다. 당신이 정확한 (통화 데이터와 같은) 소수 자리의 특정 번호까지있는 값을해야하는 경우

  • 당신은 계산을 많이 할 필요가 없습니다

    엄지 손가락의 규칙은 것 , decimal을 사용하십시오.

  • 숫자 크런치가 필요하고 고정 된 정밀도로 반올림 된 값이 필요하지 않은 경우 double precision을 사용하십시오.

+0

이것은 매우 좋은 대답입니다. 감사합니다. 따라서 부동 소수점 수학 오류는 부호와 지수 또는 기타에 대한 몇 가지 추가 비트를 저장하기 때문에'numeric'을 사용하는 한 불가능합니다 (부동 소수점을 사용하면 특정 공간에 압축하는 반면). – Tallboy

+0

음,'numeric (7,2)'를 사용하면 반올림 오류가 많이 발생하지만, 그 경우에는 사용자가 묻는 것입니다. 'numeric (200,100)'을 사용하면'double precision'보다 더 나은 정밀도를 얻을 수 있습니다. 부동 소수점 데이터 유형을 사용하면 정밀도를 구성 할 수 없습니다. –

+0

죄송합니다, 지금 약간 혼란 스럽습니다. 그래서 만약 퍼센트를'0.10' 또는'1.00' 또는'0 '으로 저장한다면.33 '은 10 %, 100 %, 33 %를 의미하고, 123이 전체 정수 (센트로 표시된 금액) 인 경우 123 * (1 - percent) % 데이터 형식에'numeric (3,2)'를 사용하는 것이 안전합니까? – Tallboy