Hello,
On 1/23/2025 1:46 PM, Kevin Bourrillion wrote:
Hi,
Before addressing your request I want to try to just add a little
context as to what’s really going on (after which Joe will probably
correct me).
I'll augment Kevin's reply anyway :-)
You might know some or all of this, but it’s a refresher for everyone
(including myself).
For some other quick background, please see the discussion of "Decimal
<-> Binary Conversion Issues" in the javadoc for java.lang.Double:
https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/lang/Double.html#decimalToBinaryConversion
In terms of concrete advice, if you want a BigDecimal equivalent to the
string form of a float value, use the BigDecimal string constructor; e.g.
float f = 0.1f;
new BigDecimal(Float.toString(f)); // BigDecimal with a numerical
value of 0.1
As Kevin noted, a numerical value of 0.1 is not the exact numerical
value of the float value 0.1f, neither 0.1 the exact numerical value of
0.1d, although the double value is much closer to 0.1.
For a more detailed explanation, my half-hour 2021 talk "What Every Java
Programmer Should Know About Floating-Point Arithmetic" [1] covers this
situation in more detail.
HTH,
-Joe
[1]
https://cr.openjdk.org/~darcy/Presentations/OracleDevLive/OracleDevLive-2021-09-FloatingPoint.pdf
https://www.youtube.com/watch?v=ajaHQ9S4uTA