λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Back/DB

[DB] DECIMAL

by μ—₯?은 2023. 8. 25.
λ°˜μ‘ν˜•

πŸ“Œ DECIMAL

: decimal 은 큰 숫자λ₯Ό μ²˜λ¦¬ν•  λ•Œ μ‚¬μš©ν•œλ‹€. ( -10^38+1 ~ 10^38-1 )

 

βœ”οΈ decimal 을 주둜 μ‚¬μš©ν•˜λŠ” 데이터

1. κΈˆμ•‘ 및 가격 데이터 

- 톡화 λ‹¨μœ„λ₯Ό ν¬ν•¨ν•œ κΈˆμ•‘μ΄λ‚˜ 가격 μ •λ³΄λŠ” μ •ν™•ν•œ 십진법 연산을 μš”κ΅¬ν•œλ‹€.

 DECIMAL은 화폐 κ°’μ˜ 정확성을 μœ μ§€ν•˜λ©΄μ„œ 연산을 μˆ˜ν–‰ν•  수 μžˆλ‹€.

2. μ„ΈκΈˆ 및 ν™˜μœ¨ 데이터

- μ„ΈκΈˆμ΄λ‚˜ ν• μΈμœ¨κ³Ό 같은 λΉ„μœ¨μ€ μ†Œμˆ˜μ  μ•„λž˜μ˜ 정밀도λ₯Ό ν•„μš”λ‘œ ν•œλ‹€.

 μ˜ˆλ₯Ό λ“€μ–΄, 5% ν• μΈμœ¨μ„ μ •ν™•νžˆ ν‘œν˜„ν•˜λ €λ©΄ μ†Œμˆ˜μ  μ•„λž˜ 2자리의 정밀도가 ν•„μš”ν•˜λ‹€.

3. 물리적 μΈ‘μ •

- 무게, 길이, 뢀피와 같은 물리적 μΈ‘μ • 값듀도 μ •ν™•ν•œ 연산을 μœ„ν•΄ DECIMAL을 μ‚¬μš©ν•  수 μžˆλ‹€.

4. λΉ„μœ¨ 및 λ°±λΆ„μœ¨

- μ–΄λ–€ 값이 전체에 λŒ€ν•œ λΉ„μœ¨μ„ λ‚˜νƒ€λ‚΄λŠ” 경우 DECIMAL을 μ‚¬μš©ν•˜μ—¬ μ •ν™•ν•œ 계산을 μˆ˜ν–‰ν•  수 μžˆλ‹€.

 

λ°˜μ‘ν˜•

 

βœ”οΈ decimal 을 μ‚¬μš©ν•˜λŠ” 이유

: 뢀동 μ†Œμˆ˜μ (floating-point) μ—°μ‚°μ˜ μ •ν™•μ„± 문제 λ•Œλ¬Έ

 

 λΆ€λ™ μ†Œμˆ˜μ μ€ 이진법을 μ‚¬μš©ν•˜μ—¬ μ‹€μˆ˜λ₯Ό ν‘œν˜„ν•˜λŠ” 방식인데, μ΄μ§„λ²•μœΌλ‘œ μ •ν™•ν•˜κ²Œ ν‘œν˜„ν•  수 μ—†λŠ” μ†Œμˆ˜μ  μˆ˜λ“€μ΄ μ‘΄μž¬ν•œλ‹€. μ΄λŠ” λ•Œλ‘œ μ—°μ‚° μ‹œ μ†Œμˆ˜μ  μ•„λž˜μ˜ 값듀이 μ •ν™•ν•˜μ§€ μ•Šκ²Œ λ˜μ–΄ κ²°κ³Όκ°€ μ˜ˆμƒκ³Ό λ‹€λ₯Ό 수 μžˆμŒμ„ μ˜λ―Έν•œλ‹€. μ΄λŠ” 돈과 같은 μ •ν™•ν•œ κΈˆμ•‘μ„ λ‹€λ£° λ•Œ 큰 λ¬Έμ œκ°€ 될 수 μžˆλ‹€.

 

 μ˜ˆλ₯Ό λ“€μ–΄, 뢀동 μ†Œμˆ˜μ μ„ μ‚¬μš©ν•˜μ—¬ 0.1κ³Ό 0.2λ₯Ό λ”ν•˜λ©΄ 0.3이 μ•„λ‹Œ 근사값이 λ‚˜μ˜¬ 수 μžˆλ‹€. 

 

 λ°˜λ©΄μ— DECIMAL 데이터 νƒ€μž…μ€ κ³ μ • μ†Œμˆ˜μ μ„ μ‚¬μš©ν•˜μ—¬ μ‹­μ§„λ²•μœΌλ‘œ 값을 μ €μž₯ν•œλ‹€. μ΄λŠ” 금육 계산과 같이 μ •ν™•ν•œ 값이 ν•„μš”ν•œ μƒν™©μ—μ„œ μ ν•©ν•˜λ‹€. DECIMAL은 μ •ν™•ν•œ μ†Œμˆ˜μ  μœ„μΉ˜λ₯Ό μœ μ§€ν•˜λ©°, 계산을 ν•  λ•Œ μ†Œμˆ˜μ  μ•„λž˜μ˜ 정밀도λ₯Ό 보μž₯ν•œλ‹€. λ”°λΌμ„œ 돈과 같은 κΈˆμ•‘μ„ μ €μž₯ν•˜κ³  λ‹€λ£° λ•Œ μ†Œμˆ˜μ  μ—°μ‚°μ˜ 정확성을 보μž₯ν•˜κΈ° μœ„ν•΄ DECIMAL 데이터 νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

 

 

βœ”οΈ decimal μ‚¬μš©λ²•

DECIMAL 데이터 νƒ€μž…μ€ μ‚¬μš©μžκ°€ μ •ν™•ν•œ μ†Œμˆ˜μ  μœ„μΉ˜μ™€ μ†Œμˆ˜μ  μ•„λž˜μ˜ 숫자 개수λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.

 

예λ₯Ό λ“€μ–΄,

DECIMAL(10, 2)은 총 10자리의 숫자λ₯Ό ν‘œν˜„ν•˜λ©°, μ†Œμˆ˜μ  μ•„λž˜μ— 2자리의 숫자λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

 

1. μ—΄ μ •μ˜

CREATE TABLE transactions (
    transaction_id INT PRIMARY KEY,
    amount DECIMAL(10, 2)
);

μœ„μ˜ μ˜ˆμ‹œμ—μ„œ amount 열은 μ΅œλŒ€ 10자리의 숫자λ₯Ό ν—ˆμš©ν•˜λ©°, μ†Œμˆ˜μ  μ•„λž˜μ— 2자리의 숫자λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

 

2. κ°’ μ €μž₯

INSERT INTO transactions (transaction_id, amount)
VALUES (1, 123.45);

μœ„μ˜ μ˜ˆμ‹œμ—μ„œ 123.45λŠ” DECIMAL(10, 2)에 λ§žλŠ” ν˜•μ‹μœΌλ‘œ μ €μž₯λœλ‹€.

 

3. κ°’ 검색

SELECT transaction_id, amount
FROM transactions
WHERE amount > 100;

DECIMAL 값을 λΉ„κ΅ν•˜κ±°λ‚˜ 검색할 λ•Œλ„ μ •ν™•ν•œ 십진법 연산을 톡해 κ²°κ³Όλ₯Ό 얻을 수 μžˆλ‹€.

 

4.  μ—°μ‚°

UPDATE transactions
SET amount = amount + 10.50
WHERE transaction_id = 1;

DECIMAL 값을 μ—°μ‚°ν•  λ•Œλ„ μ†Œμˆ˜μ  μ•„λž˜μ˜ 정밀도가 μœ μ§€λ˜λ©°, μ •ν™•ν•œ κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€.

 

 

βž• 근데!! Java μ—μ„œλŠ” μ‚¬μš©λ²•μ΄ 쑰금 λ‹€λ₯΄λ‹€.

BigDecimal sum = value1.add(value2);      // λ§μ…ˆ
BigDecimal difference = value1.subtract(value2); // λΊ„μ…ˆ
BigDecimal product = value1.multiply(value2);   // κ³±μ…ˆ
BigDecimal quotient = value1.divide(value2, BigDecimal.ROUND_HALF_UP);  // λ‚˜λˆ—μ…ˆ

 

 

 

λ°˜μ‘ν˜•

'Back > DB' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[DB] PostgreSQL κ³Ό MariaDB 의 νŠΉμ§•, 차이점  (5) 2023.07.18
[DB] μŠ€ν”„λ§ νŠΈλžœμž­μ…˜  (0) 2023.05.18
[DB] QueryDSL  (0) 2023.05.12
[DB] JPA  (0) 2023.05.12
[DB] MyBatis  (0) 2023.05.09