Comparing Floating-Point Numbers
Problem
You want to compare two floating-point numbers for equality.
Solution
Based on what we’ve just discussed, you probably won’t
just go comparing two floats or doubles for equality. You might
expect the floating-point wrapper classes, Float
and Double
, to override the equals( )
method, and they do. The equals( )
method returns true if the two values are the same bit for bit, that
is, if and only if the numbers are the same, or are both
NaN
. It returns false otherwise, including if the
argument passed in is null, or if one object is +0.0 and the other is
-0.0.
If this sounds weird, remember that the complexity comes partly from the nature of doing real number computations in the less-precise floating-point hardware, and partly from the details of the IEEE Standard 754, which specifies the floating-point functionality that Java tries to adhere to, so that underlying floating-point processor hardware can be used even when Java programs are being interpreted.
To actually compare floating-point numbers for equality, it is
generally desirable to compare them within some tiny range of
allowable differences; this range is often regarded as a tolerance or
as epsilon. Example 5-1 shows
an equals( )
method you can use to do this
comparison, as well as comparisons on values of
NaN
. When run, it prints that the first two
numbers are equal within epsilon.
$ java FloatCmp True within epsilon 1.0E-7 $
Example 5-1. FloatCmp.java
/** * Floating-point comparisons. ...
Get Java Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.