# Decimal

Decimal values represent exact fixed-point numbers. They preserve decimal digits during addition, subtraction and multiplication. Division discards excess fractional digits instead of rounding them.

Use Decimal for amounts, prices and other values that require an exact decimal scale.

## Syntax

```text
Decimal(P, S)
Decimal(P)
Decimal
Decimal32(S)
Decimal64(S)
Decimal128(S)
Decimal256(S)
NUMERIC(P, S)
```

## Parameters

* `P` — Precision: the total number of decimal digits, from 1 through 76.
* `S` — Scale: the number of fractional digits, from 0 through `P`.

`Decimal(P)` means `Decimal(P, 0)`. Bare `Decimal` and bare `NUMERIC` mean `Decimal(10, 0)`. Use `LEGACY_NUMERIC` for SQLite numeric affinity.

| Declaration     | Precision |
| --------------- | --------- |
| `Decimal32(S)`  | 9         |
| `Decimal64(S)`  | 18        |
| `Decimal128(S)` | 38        |
| `Decimal256(S)` | 76        |

## Decimal Value Ranges

The coefficient must contain at most `P` digits. Values lie strictly between `-10^(P-S)` and `10^(P-S)`, in steps of `10^-S`. For example, `Decimal(5, 2)` accepts values from `-999.99` through `999.99`.

The range is checked during casts, table writes and arithmetic. Overflow raises `NUMERIC_OVERFLOW` for every supported precision.

## Operations and Result Type

| Operation                | Result scale                   |
| ------------------------ | ------------------------------ |
| Addition and subtraction | The larger operand scale.      |
| Multiplication           | The sum of the operand scales. |
| Division                 | The left operand scale.        |

Division truncates excess fractional digits toward zero. Decimal division and remainder by zero raise `INVALID_ARGUMENT`.

Cast approximate floating-point values explicitly before combining them with Decimal. A decimal literal supplied as text avoids an initial binary floating-point approximation. Statistical functions may return an approximate result even when their input is Decimal; consult the function reference.

## Examples

### Exact addition

```sql
SELECT CAST('1.20' AS Decimal(18, 2))
     + CAST('2.40' AS Decimal(18, 2)) AS amount
FORMAT csv;
```

```text
3.60
```

### Division without rounding

```sql
SELECT CAST('2.0000' AS Decimal(18, 4)) / 3,
       CAST('-2.0000' AS Decimal(18, 4)) / 3
FORMAT csv;
```

```text
0.6666,-0.6666
```

### Storing prices

```sql
CREATE TABLE products(id UInt32, price Decimal(18, 2));
INSERT INTO products VALUES (1, '19.95'), (2, '5.05');
```

```sql
SELECT sum(price) AS total_price
FROM products
FORMAT csv;
```

```text
25.00
```
