# otp.decimal

### *class* decimal(\*args, \*\*kwargs)

Bases: [`object`](https://docs.python.org/3/library/functions.html#object)

Object that represents decimal OneTick value.
Decimal is 128 bit base 10 floating point number.

* **Parameters:**
  **value** ([*int*](https://docs.python.org/3/library/functions.html#int) *,* [*float*](https://docs.python.org/3/library/functions.html#float) *,* [*str*](https://docs.python.org/3/library/stdtypes.html#str)) -- The value to initialize decimal from.
  Note that float values may be converted with precision lost.

### Examples

[`decimal`](#onetick.py.decimal) objects can be used in tick generators
and column operations as any other onetick-py type:

```pycon
>>> t = otp.Ticks({'A': [otp.decimal(1), otp.decimal(2)]})
>>> t['B'] = otp.decimal(1.23456789)
>>> t['C'] = t['A'] / 0
>>> t['D'] = t['A'] + otp.nan
>>> otp.run(t)
                     Time    A         B    C    D
0 2003-12-01 00:00:00.000  1.0  1.234568  inf  NaN
1 2003-12-01 00:00:00.001  2.0  1.234568  inf  NaN
```

Additionally, any arithmetic operation with [`decimal`](#onetick.py.decimal) object will return
an [`Operation`](../operation/root.md#onetick.py.Operation) object:

```pycon
>>> t = otp.Tick(A=1)
>>> t['X'] = otp.decimal(1) / 0
>>> otp.run(t)
        Time    A    X
0 2003-12-01    1  inf
```

Note that converting from float (first row) may result in losing precision.
[`decimal`](#onetick.py.decimal) objects are created from strings or integers, so they don't lose precision:

```pycon
>>> t0 = otp.Tick(A=0.1)
>>> t1 = otp.Tick(A=otp.decimal(0.01))
>>> t2 = otp.Tick(A=otp.decimal('0.001'))
>>> t3 = otp.Tick(A=otp.decimal(1) / otp.decimal(10_000))
>>> t = otp.merge([t0, t1, t2, t3], enforce_order=True)
>>> t['STR_A'] = t['A'].decimal.str(34)
>>> otp.run(t)
        Time       A                                 STR_A
0 2003-12-01  0.1000  0.1000000000000000055511151231257827
1 2003-12-01  0.0100  0.0100000000000000000000000000000000
2 2003-12-01  0.0010  0.0010000000000000000000000000000000
3 2003-12-01  0.0001  0.0001000000000000000000000000000000
```

Note that [`otp.Ticks`](../sources/ticks.md#onetick.py.Ticks) will convert everything from string under the hood,
so even the float values will not lose precision:

```pycon
>>> t = otp.Ticks({'A': [0.1, otp.decimal(0.01), otp.decimal('0.001'), otp.decimal(1e-4)]})
>>> t['STR_A'] = t['A'].decimal.str(34)
>>> otp.run(t)
                     Time       A                                 STR_A
0 2003-12-01 00:00:00.000  0.1000  0.1000000000000000000000000000000000
1 2003-12-01 00:00:00.001  0.0100  0.0100000000000000000000000000000000
2 2003-12-01 00:00:00.002  0.0010  0.0010000000000000000000000000000000
3 2003-12-01 00:00:00.003  0.0001  0.0001000000000000000000000000000000
```

#### to_operation()
