Режимы округления BigDecimal - PullRequest
       30

Режимы округления BigDecimal

0 голосов
/ 06 января 2019

Мы заменяем некоторый код sybase на Java и имеем проблему с Rounding BigDecimal, чтобы соответствовать тому, что возвращает sybase

11.4443999999999999062083588796667754650115966796875 - должен вернуть 11,44

и

35,9549999999999982946974341757595539093017578125 - должен возвращаться 35,96

Я пробовал все варианты округления со шкалой 2, но ни один из них не работает для обоих. Какой самый лучший вариант?

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Вам нужно будет сделать два шага. Первый раунд в масштабе 3, затем в масштабе 2, используя RoundingMode.HALF_UP:

BigDecimal value1 = new BigDecimal("11.4443999999999999062083588796667754650115966796875");      
BigDecimal value2 = new BigDecimal("35.9549999999999982946974341757595539093017578125"); 

BigDecimal rounded1 = value1.setScale(3, RoundingMode.HALF_UP); // 11.444
rounded1 = rounded1.setScale(2, RoundingMode.HALF_UP);          // 11.44

BigDecimal rounded2 = value2.setScale(3, RoundingMode.HALF_UP); // 35.955
rounded2 = rounded2.setScale(2, RoundingMode.HALF_UP);          // 35.96
0 голосов
/ 06 января 2019

Это решение неэффективно, но оно выполняет свою работу.

Исходный код

import java.math.BigDecimal;

public class BigDecimalRound {
    public static void main(String[] args) {
        BigDecimal bd;
        float f;

        bd = new BigDecimal(11.4443999999999999062083588796667754650115966796875);
        f = roundBigDecimal(bd, 2);
        System.out.println("bd: " + bd + ", f: " + f);

        bd = new BigDecimal(35.9549999999999982946974341757595539093017578125);
        f = roundBigDecimal(bd, 2);
        System.out.println("bd: " + bd + ", f: " + f);
    }

    public static float roundBigDecimal(BigDecimal bd, int precision) {
        int i = (int) Math.pow(10, precision);
        return (float) Math.round(bd.floatValue() * i) / i;
    }
}

выход

bd: 11.4443999999999999062083588796667754650115966796875, f: 11.44
bd: 35.9549999999999982946974341757595539093017578125, f: 35.96
...