--- title: Number Types | PureScript description: Learn about PureScript number types, their use and some useful tips and considerations about them. --- # Number Types Numbers can be of type `Number` and `Int`. Both are represented as normal JavaScript numbers at runtime. `Int`, however, has operations defined differently so that we always get integer results: ```text > div 7 2 3 > mod 7 2 1 > div 7.0 2.0 3.5 > mod 7.0 2.0 0.0 ``` Note how `div 7 2` results in 3, rather than 3.5. A number *without* a decimal is always considered an `Int`, while a number *with* a decimal is always considered a `Number`. Exponential notation always means the type is `Number`: ```text > 1 1 > :type 1 Int > 1.0 1.0 > :type 1.0 Number > 1e0 1.0 > :type 1e0 Number > 1e-2 0.01 > :type 1e-2 Number ``` They Int-typed operations are made to return integers with some use of bitwise operators, as we can see in `.spago/prelude/v6.0.0/src/Data/Ring.js`: ```js export const intSub = function (x) { return function (y) { return x - y | 0; }; }; ``` ## Typing a number As we saw, 1 is `Int`, while `1.0` or `1e0` is `Number`. We cannot force a value like `1` to be `Number` simply by adding a type annotation like in Haskell. ```haskell n :: Number n = 1 ``` The above will produce an error: ```text Could not match type Could not match type Int with type Number while checking that type Int is at least as general as type Number while checking that expression 1 has type Number in value declaration n PureScript(TypesDoNotUnify) ``` ## Negative Numbers To make negative numbers, use the unary `-` operator (requires parenthesis) or the `negate` function. ```text > 1 + (-1) 0 > 1 + negate 1 0 ``` ## References - [Official Docs on PureScript Types](https://github.com/purescript/documentation/blob/master/language/Types.md).