]>
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 | |
6f036462 | 19 | const x = 0X2_000000000_0001; |
ebb53d86 TL |
20 | ``` |
21 | ||
22 | Examples of **correct** code for this rule: | |
23 | ||
24 | ```js | |
25 | /*eslint no-loss-of-precision: "error"*/ | |
26 | ||
27 | const x = 12345 | |
28 | const x = 123.456 | |
29 | const x = 123e34 | |
30 | const x = 12300000000000000000000000 | |
31 | const x = 0x1FFFFFFFFFFFFF | |
32 | const x = 9007199254740991 | |
6f036462 | 33 | const x = 9007_1992547409_91 |
ebb53d86 | 34 | ``` |