Java :: сравнение округленных двойников не работает - PullRequest
1 голос
/ 10 апреля 2020

Я хочу сравнить два числа:

  • -3.123
  • -3.123456

Я буду использовать double для их хранения и Я просто хочу рассмотреть первые 3 десятичных числа , поэтому:

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

public class DecimalComparator {
    public static void main(String[] args) {
        areEqualByThreeDecimalPlaces(-3.123, -3.123456);
    }

    public static boolean areEqualByThreeDecimalPlaces (double one, double two) {
        boolean same = true;

        DecimalFormat df = new DecimalFormat("#.###");
        df.setRoundingMode(RoundingMode.FLOOR);
        System.out.println(df.format(one));
        System.out.println(df.format(two));

        if (df.format(one).equals(df.format(two))) {
            same = true;
            System.out.println("true");
        } else {
            same = false;
            System.out.println("false");
        }
        return same;
    }
}

Код возвращает меня:

-3.123
-3.124
false

почему второе число округляется до - 3,124?

Ответы [ 2 ]

1 голос
/ 10 апреля 2020
Hi its just that when u round off 3.123456 it works the below way when decimal 
places are reduced :

 3.12346
 3.1235
 3.124
 3.12
 3.1 

//commenting the set rounding mode will make it work the way u want.
public static void main (String[] args ) {
        double one =-3.123;
         double two = -3.123456;
        boolean same = true;

        DecimalFormat df = new DecimalFormat("#.###");
        //remove this line
        //df.setRoundingMode(RoundingMode.FLOOR);

        System.out.println(df.format(one));
        System.out.println(df.format(two));

        if (df.format(one).equals(df.format(two))) {
            same = true;
            System.out.println("true");
        } else {
            same = false;
            System.out.println("false");
        }
        System.out.println(same);
    }
0 голосов
/ 10 апреля 2020

RoundingMode.FLOOR округляет число в сторону уменьшения - ваш код будет работать для положительных чисел, но не для отрицательных чисел. Вам нужно использовать RoundingMode.DOWN, который просто удаляет цифры после N мест:

df.setRoundingMode(RoundingMode.DOWN);
// Here ------------------------^
...