Как HALF_DOWN плавающее значение, как конвертировать 4.8 в 4.5? - PullRequest
0 голосов
/ 24 декабря 2018

Например: Я хочу отображать оценки, например, 4,5, если значения поступают с сервера, например, 4,8.Хорошо, если значение сервера равно 5, и мне нужно отображать оценки 5.

Что я пробовал?

Я пробовал некоторые нативные методы, такие как

BigDecimal(libraryItem.ratingScore.toDouble()).setScale(2, RoundingMode.HALF_UP).toFloat()

и я попробовал это также

Math.ceil(number*2)/2;

Но это не работает так, как я хочу


Очень простой вопрос: как получить ближайшее плавающее число?как 4.5, 3.5, 2.5 и т. д., если значения равны 4.8, 3.6, 2.7.

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

в качестве альтернативы, без использования Math Api, выполните округление вручную на основе дроби,
больше половины или нет, затем установите правильное значение:

private double roundToHalfDown(double val) {
    double half = 0.5d;
    BigDecimal bigDecimalVal = new BigDecimal(String.valueOf(val));
    int intValue = bigDecimalVal.intValue();
    double fraction = bigDecimalVal.subtract(new BigDecimal(intValue)).doubleValue();
    if(val > 0) {
        val = fraction > half ? intValue + half : intValue;
    } else {    
        if(fraction == 0) {
            val = intValue;
        } else if(fraction > -half) {
            val = intValue - half;
        } else {
            val = intValue - 1;
        }   
    }
    return val;
}

roundToHalfDown(4.8);
Output : 4.5
roundToHalfDown(4.4);
Output : 4.0

для простого решения, которое вы можете использоватьформула:

double valRounded = Math.round((val / 0.5d) - 0.5d) / 2d;

здесь вывод:

val = -3.9 ---> valRounded = -4.0
val = -3.1 ---> valRounded = -3.5
val = 4.8 ---> valRounded = 4.5
0 голосов
/ 24 декабря 2018

Если вы не чувствуете себя комфортно, используя способ полукругления BigDecimal, вы можете использовать следующую формулу:

double val = 4.8d;
double step = val > 0 ? -0.5d : 0.5d;
double valRounded = Math.round(2*val-step) / 2d;

valRounded будет 4.5, как вы ожидаете,Вот цикл, показывающий, как значения округляются наполовину по этой формуле:

for (double val=4d; val <= 5.1d; val=val+0.1d) {
    double step = val > 0 ? -0.5d : 0.5d;
    System.out.println(val + "->" + Math.round(2*val+step)/2d);
}

4.0->4.0
4.1->4.0
4.2->4.0
4.3->4.0
4.4->4.0
4.5->4.5
4.6->4.5
4.7->4.5
4.8->4.5
4.9->4.5
5.0->5.0
5.1->5.0
...