user1597002
user1597002

Reputation:

Round half even for double

I need to round to nearest 0.5 if possible.

10.4999 = 10.5

Here is quick code:

import java.text.DecimalFormat;
import java.math.RoundingMode;

public class DecimalFormat  
{  
   public static void main(String[] args)  
   {  
      DecimalFormat dFormat = new DecimalFormat("#.0");
      dFormat.setRoundingMode(RoundingMode.HALF_EVEN);

      final double test = 10.4999;

      System.out.println("Format: " + dFormat.format(test));
   }  
}  

This doesn't work because 6.10000... rounds to 6.1 etc...need it to round to 6.0

Thanks for any feedback.

Upvotes: 5

Views: 8103

Answers (3)

Elist
Elist

Reputation: 5533

public class DecimalFormat  
{  
    public static void main(String[] args)  
    {  
        double test = 10.4999;

        double round;
        int i = (int) test;
        double fraction = test - i;
        if (fraction < 0.25) {
            round = (double) i;
        } else if (fraction < 0.75) {
            round = (double) (i + 0.5);
        } else {
            round = (double) (i + 1);
        }
        System.out.println("Format: " + round);
    }  
}  

Upvotes: 0

DannyMo
DannyMo

Reputation: 11984

A more general solution to @RobWatt's answer in case you ever want to round to something else:

private static double roundTo(double v, double r) {
  return Math.round(v / r) * r;
}

System.out.println(roundTo(6.1, 0.5));     // 6.0
System.out.println(roundTo(10.4999, 0.5)); // 10.5
System.out.println(roundTo(1.33, 0.25));   // 1.25
System.out.println(roundTo(1.44, 0.125));  // 1.5

Upvotes: 8

Rob Watts
Rob Watts

Reputation: 7146

Rather than try rounding to the nearest 0.5, double it, round to the nearest int, then divide by two.

This way, 2.49 becomes 4.98, rounds to 5, becomes 2.5.
2.24 becomes 4.48, rounds to 4, becomes 2.

Upvotes: 12

Related Questions