Arredondar decimal ou Generico respentando se Dezena, centana, Milhar

Pessoal, encontrei a solução para um post que abri ha uma semana atrás, esta funcionando para todos os números abaixo de 9.00, ao digitar por exemplo 8.99 ele calcula 9.00, outro valor 5.10 ele calcula para 9.00, é um padrão para lojas, mas ao digitar 9.00 e 12, o nove, deveria ficar nove mesmo, já o 12, teria que ser 19.00, e ai por diante. Segue algoritmo, se alguém puder me ajudar agradeço.

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;


public class CalcularPressificacaoFinal9 {

	public static void main(String[] args) {
		BigDecimal vlr = new BigDecimal("9.00");
		BigDecimal resultado = calculaPrecoFinal9(vlr); // Chama método para calcular precificação
		System.out.println("Precificação9.00:    R$ " +resultado);
	}
	
	// Metodo para calcular precificaçao do Produto 9.00
	private static BigDecimal calculaPrecoFinal9(BigDecimal valor){
		BigDecimal bdValor = new BigDecimal(valor.toString());
		
		// Valor padrão
        BigDecimal bgEstabelecido9;
        bgEstabelecido9 = new BigDecimal("9.00"); // Valor fixo casa 9.00
        MathContext mc = new MathContext(2); // 2 casas de precisão

        //cria o objeto do tipo int
        int res;

        res = bdValor.compareTo(bgEstabelecido9); // compara valor do paramentro com  bdEstabelecido9
        
    	bdValor = bdValor.multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP); // Multiplico por 100
    	BigDecimal prVenda = bdValor = bdValor.divide(new BigDecimal("100"), 2, RoundingMode.HALF_DOWN); // Pego o valor da multiplicação e divido por 100
    	BigDecimal cValor = prVenda.setScale(2, BigDecimal.ROUND_UP); // Truncando valor
    	
	    cValor = cValor.remainder(bgEstabelecido9, mc); // Pego o resto 
	    System.out.println("RESTO: " +cValor);
	    
	    // Efetuo a verificacao se é 9 ou 19
    	BigDecimal newBdCValor = new BigDecimal("0.00");
    	if(cValor.doubleValue() <= 9.00){ // No Delphi e 9 
    		BigDecimal subtrair9 = new BigDecimal("9.00");
    		System.out.println("Resto e nove "+cValor+ " | " +subtrair9);
    		cValor = subtrair9.subtract(cValor).setScale(2, RoundingMode.HALF_DOWN);
    		System.out.println("Falta: "+cValor+ " Para 9.00");
    		//cValor = cValor.add(cValor);
    	}else{
    		BigDecimal subtrair9 = new BigDecimal("19.00");
    		cValor = subtrair9.subtract(cValor).setScale(2, RoundingMode.HALF_DOWN);
    		System.out.println(cValor);
    		//cValor = cValor.add(cValor);
    	}
    	Double numberDb;
    	// Round, em varios locais do sistema utilizo
    	numberDb = round(prVenda.doubleValue(), cValor.doubleValue(), 3, BigDecimal.ROUND_HALF_UP);
    	
    	System.out.println("Vou somar prVenda e cValor: "+prVenda + " | " +cValor);
    	System.out.println("round com soma "+numberDb);
    	BigDecimal dPreco = new BigDecimal(numberDb);
		return dPreco.setScale(2, RoundingMode.CEILING); 
	}
	
	
	public static double round(double unroundesSun, double unrounded, int precision, int roundingMode)
	{
	    BigDecimal bd = new BigDecimal(unrounded);
	    BigDecimal bd2 = new BigDecimal(unroundesSun);
	    bd = bd.add(bd2);
	    BigDecimal rounded = bd.setScale(precision, roundingMode);
	    return rounded.doubleValue();
	}	
}

Pessoal boa tarde tudo bem, consegui decifrar em partes, agora digito para meus números < 9.00 e exibem sempre arredondamento 9.00 e para meus < 19.00 vai ser exibido 19.00, como no exemplo 1.90 vai exibir 9.00, digitar 15.47 vai ficar 19.00, mas agora o problema e números maiores que isso, tipo 19.10, teria que arredondar agora para 29.00, e se digitar 29.45, arredondar para 39.00, sempre seguindo 9, segue o que eu consegui fazer abaixo, deve ser um pequeno detalhe para eu concluir, se vocês puderem me dar um Help agradeço.

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;


public class CalcularPressificacaoFinal9 {

	public static void main(String[] args) {
		BigDecimal vlr = new BigDecimal("19.00");
		BigDecimal resultado = calculaPrecoFinal9(vlr); // Chama método para calcular precificação
		System.out.println("Precificação9.00:    R$ " +resultado);
	}
	
	// Metodo para calcular precificaçao do Produto 9.00
	private static BigDecimal calculaPrecoFinal9(BigDecimal valor){
		BigDecimal bdValor = new BigDecimal(valor.toString());
		
		// Valor padrão
        BigDecimal bgEstabelecido9;
        bgEstabelecido9 = new BigDecimal("9.00"); // Valor fixo casa 9.00
        MathContext mc = new MathContext(2); // 2 casas de precisão

        //cria o objeto do tipo int
        int res;

        res = bdValor.compareTo(bgEstabelecido9); // compara valor do paramentro com  bdEstabelecido9
        
    	bdValor = bdValor.multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP); // Multiplico por 100
    	BigDecimal prVenda = bdValor = bdValor.divide(new BigDecimal("100"), 2, RoundingMode.HALF_DOWN); // Pego o valor da multiplicação e divido por 100
    	BigDecimal cValor = prVenda.setScale(2, BigDecimal.ROUND_UP); // Truncando valor
    	
	    cValor = cValor.remainder(bgEstabelecido9, mc); // Pego o resto 
	    System.out.println("RESTO: " +cValor);
	    
	    // Efetuo a verificacao se é 9 ou 19
    	BigDecimal newBdCValor = new BigDecimal("0.00");
    	if(bdValor.doubleValue() <= 9.00){ // No Delphi e 9 
    		BigDecimal subtrair9 = new BigDecimal("9.00");
    		System.out.println("Resto e nove "+cValor+ " | " +subtrair9);
    		if(bdValor.doubleValue() == 9.00){ // Tenho que setar nove ser digitar 9.00
    			BigDecimal cValorZero = new BigDecimal("9.00");
    			cValor = cValorZero;
    		}
    		System.out.println(bdValor);
    		cValor = subtrair9.subtract(cValor).setScale(2, RoundingMode.HALF_DOWN);
    		System.out.println("Falta: "+cValor+ " Para 9.00");
    		//cValor = cValor.add(cValor);
    	}else{
    		BigDecimal subtrair9 = new BigDecimal("19.00");
    		System.out.println("else subtrair9 "+subtrair9+ " | " +cValor);
    		cValor = subtrair9.subtract(prVenda).setScale(2, RoundingMode.HALF_DOWN);
    		//cValor = cValor.add(cValor);
    	}
    	Double numberDb;
    	// Round, em varios locais do sistema utilizo
    	numberDb = round(prVenda.doubleValue(), cValor.doubleValue(), 3, BigDecimal.ROUND_HALF_UP);
    	
    	System.out.println("Vou somar prVenda e cValor: "+prVenda + " | " +cValor);
    	System.out.println("round com soma "+numberDb);
    	BigDecimal dPreco = new BigDecimal(numberDb);
		return dPreco.setScale(2, RoundingMode.CEILING); 
	}
	
	
	public static double round(double unroundesSun, double unrounded, int precision, int roundingMode)
	{
	    BigDecimal bd = new BigDecimal(unrounded);
	    BigDecimal bd2 = new BigDecimal(unroundesSun);
	    bd = bd.add(bd2);
	    BigDecimal rounded = bd.setScale(precision, roundingMode);
	    return rounded.doubleValue();
	}	
}

Obrigado pessoal.

Ou eu não percebi o que queres, ou podes simplificar para algo assim

[code]
private static BigDecimal calculaPrecoFinal9(BigDecimal valor) {

valor = valor.add(BigDecimal.ONE);
valor = valor.divide(BigDecimal.TEN, 0, BigDecimal.ROUND_UP);
valor = valor.multiply(BigDecimal.TEN);
valor = valor.subtract(BigDecimal.ONE);

return valor;

}[/code]