Double value to round up in Java

后端 未结 10 1904
我寻月下人不归
我寻月下人不归 2020-12-07 12:44

I have a double value = 1.068879335 i want to round it up with only two decimal values like 1.07.

I tried like this

DecimalFormat df=new         


        
相关标签:
10条回答
  • 2020-12-07 13:26

    You could try defining a new DecimalFormat and using it as a Double result to a new double variable.

    Example given to make you understand what I just said.

    double decimalnumber = 100.2397;
    DecimalFormat dnf = new DecimalFormat( "#,###,###,##0.00" );
    double roundednumber = new Double(dnf.format(decimalnumber)).doubleValue();
    
    0 讨论(0)
  • 2020-12-07 13:27

    Note the comma in your string: "1,07". DecimalFormat uses a locale-specific separator string, while Double.parseDouble() does not. As you happen to live in a country where the decimal separator is ",", you can't parse your number back.

    However, you can use the same DecimalFormat to parse it back:

    DecimalFormat df=new DecimalFormat("0.00");
    String formate = df.format(value); 
    double finalValue = (Double)df.parse(formate) ;
    

    But you really should do this instead:

    double finalValue = Math.round( value * 100.0 ) / 100.0;
    

    Note: As has been pointed out, you should only use floating point if you don't need a precise control over accuracy. (Financial calculations being the main example of when not to use them.)

    0 讨论(0)
  • 2020-12-07 13:30

    Live @Sergey's solution but with integer division.

    double value = 23.8764367843;
    double rounded = (double) Math.round(value * 100) / 100;
    System.out.println(value +" rounded is "+ rounded);
    

    prints

    23.8764367843 rounded is 23.88
    

    EDIT: As Sergey points out, there should be no difference between multipling double*int and double*double and dividing double/int and double/double. I can't find an example where the result is different. However on x86/x64 and other systems there is a specific machine code instruction for mixed double,int values which I believe the JVM uses.

    for (int j = 0; j < 11; j++) {
        long start = System.nanoTime();
        for (double i = 1; i < 1e6; i *= 1.0000001) {
            double rounded = (double) Math.round(i * 100) / 100;
        }
        long time = System.nanoTime() - start;
        System.out.printf("double,int operations %,d%n", time);
    }
    for (int j = 0; j < 11; j++) {
        long start = System.nanoTime();
        for (double i = 1; i < 1e6; i *= 1.0000001) {
            double rounded = (double) Math.round(i * 100.0) / 100.0;
        }
        long time = System.nanoTime() - start;
        System.out.printf("double,double operations %,d%n", time);
    }
    

    Prints

    double,int operations 613,552,212
    double,int operations 661,823,569
    double,int operations 659,398,960
    double,int operations 659,343,506
    double,int operations 653,851,816
    double,int operations 645,317,212
    double,int operations 647,765,219
    double,int operations 655,101,137
    double,int operations 657,407,715
    double,int operations 654,858,858
    double,int operations 648,702,279
    double,double operations 1,178,561,102
    double,double operations 1,187,694,386
    double,double operations 1,184,338,024
    double,double operations 1,178,556,353
    double,double operations 1,176,622,937
    double,double operations 1,169,324,313
    double,double operations 1,173,162,162
    double,double operations 1,169,027,348
    double,double operations 1,175,080,353
    double,double operations 1,182,830,988
    double,double operations 1,185,028,544
    
    0 讨论(0)
  • 2020-12-07 13:35

    Try this: org.apache.commons.math3.util.Precision.round(double x, int scale)

    See: http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/util/Precision.html

    Apache Commons Mathematics Library homepage is: http://commons.apache.org/proper/commons-math/index.html

    The internal implemetation of this method is:

    public static double round(double x, int scale) {
        return round(x, scale, BigDecimal.ROUND_HALF_UP);
    }
    
    public static double round(double x, int scale, int roundingMethod) {
        try {
            return (new BigDecimal
                   (Double.toString(x))
                   .setScale(scale, roundingMethod))
                   .doubleValue();
        } catch (NumberFormatException ex) {
            if (Double.isInfinite(x)) {
                return x;
            } else {
                return Double.NaN;
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题