time

Decimal precision in Java

It's well known misunderstanding of decimal precision in Java that 0.1 + 0.1 + 0.1 will output 0.30000000000000004. In general it is not a problem. It is how double works.

You can control precision with DecimalFormat. The pattern is a String and can consist of zeros, which will set a digit or 0 if no digit present, a #, which will set a digit or nothing if no digit present.

import java.text.DecimalFormat;

class DecimalTest {
    public static void main(String[] args) {
        DecimalFormat df = new DecimalFormat("#.##");
        double x = 0.1 + 0.1 + 0.1;
        System.out.println(df.format(x))); 
    }
}

Or use BigDecimal for math operations

import java.text.DecimalFormat;

class DecimalTest {
    public static void main(String[] args) {
        // example 1
        BigDecimal d = new BigDecimal("0.1").add(new BigDecimal("0.1")).add(new BigDecimal("0.1"));
        System.out.println(d); 

        // example 2
        double d = 0.1 + 0.1 + 0.1;
        BigDecimal bd = new BigDecimal(Double.toString(d));
        bd = bd.setScale(5, BigDecimal.ROUND_HALF_UP);
        System.out.println(bd); 
    }
}

Also you can use NumberFormat

import java.text.NumberFormat;

public class DeciamlTest {
    public static void main(String args[]) {
        double x = 0.1 + 0.1 + 0.1;
        NumberFormat fmt = NumberFormat.getInstance( );
        fmt.setMinimumIntegerDigits(1);
        fmt.setMinimumFractionDigits(2);
        System.out.println(fmt.format(x));
    }
}
comments powered by Disqus