File: BigDecimalLiteralDouble.md

package info (click to toggle)
error-prone-java 2.18.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 23,204 kB
  • sloc: java: 222,992; xml: 1,319; sh: 25; makefile: 7
file content (16 lines) | stat: -rw-r--r-- 646 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
BigDecimal's `double` can lose precision in surprising ways.

```java
  // these are the same:
  new BigDecimal(0.1)
  new BigDecimal("0.1000000000000000055511151231257827021181583404541015625")
```

Prefer the `BigDecimal.valueOf(double)` method or the `new BigDecimal(String)`
constructor.

NOTE `BigDecimal.valueOf(double)` does not suffer from the same problem; it is
equivalent to `new BigDecimal(Double.valueOf(double))`, and while `0.1` is not
exactly representable, `Double.valueOf(0.1)` yields `"0.1"`. As long as
[FloatingPointLiteralPrecision](./FloatingPointLiteralPrecision) doesn't
generate a warning, `BigDecimal.valueOf` is safe.