]>
Commit | Line | Data |
---|---|---|
ebb53d86 TL |
1 | # Disallow Number Literals That Lose Precision (no-loss-of-precision) |
2 | ||
3 | This rule would disallow the use of number literals that immediately lose precision at runtime when converted to a JS `Number` due to 64-bit floating-point rounding. | |
4 | ||
5 | ## Rule Details | |
6 | ||
7 | In JS, `Number`s are stored as double-precision floating-point numbers according to the [IEEE 754 standard](https://en.wikipedia.org/wiki/IEEE_754). Because of this, numbers can only retain accuracy up to a certain amount of digits. If the programmer enters additional digits, those digits will be lost in the conversion to the `Number` type and will result in unexpected behavior. | |
8 | ||
9 | Examples of **incorrect** code for this rule: | |
10 | ||
11 | ```js | |
12 | /*eslint no-loss-of-precision: "error"*/ | |
13 | ||
14 | const x = 9007199254740993 | |
15 | const x = 5123000000000000000000000000001 | |
16 | const x = 1230000000000000000000000.0 | |
17 | const x = .1230000000000000000000000 | |
18 | const x = 0X20000000000001 | |
19 | ``` | |
20 | ||
21 | Examples of **correct** code for this rule: | |
22 | ||
23 | ```js | |
24 | /*eslint no-loss-of-precision: "error"*/ | |
25 | ||
26 | const x = 12345 | |
27 | const x = 123.456 | |
28 | const x = 123e34 | |
29 | const x = 12300000000000000000000000 | |
30 | const x = 0x1FFFFFFFFFFFFF | |
31 | const x = 9007199254740991 | |
32 | ``` |