How Java’s Floating Point Hurts Everyone Everywhere

Consider the following Simple Code:

class SubTest{
    public static void main(String[] args){
        double a = 10.00;
        double b = 10.60;
        double c = 10.50;

        System.out.println("b - a :" + (b-a));
        System.out.println("c - a :" + (c-a));
    }
}

What could be the output??

b - a :0.5999999999999996
c - a :0.5

Well, we know in simple maths 10.60 – 10.00 = .60;

But, why is the computation adding a small signed error to the result!!!. The computer floating point unit works internally in base 2, binary ie., the Representation of repeater fraction 1/3 = 0.33333 in base 10. Such fractions cannot be precisely represented in base10. The same fundamental mathematical cause is at work.

To avoid such errors, we can look at using BigDecimal:

import java.math.*;

public class SubTest1{
    public static void main(String args[]){
        BigDecimal num1 = new BigDecimal("10.60");
        BigDecimal num2 = new BigDecimal("10.00");
        BigDecimal result = num1.subtract(num2).setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println("num1 - num2 :" + result);
    }
}

And, the result:
num1 - num2 :0.60

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.