Como obter o Resto da divisão inteira (%) para um BigDecimal

		BigDecimal A = new BigDecimal( 30.659 );
		BigDecimal B = new BigDecimal( 1.333 );
		
		BigDecimal C = null; // algo do tipo A%B

		System.out.println( ":&gt " + C );

http://java.sun.com/j2se/1.4.2/docs/api/java/math/BigDecimal.html#divide(java.math.BigDecimal,%20int)

Ops, não lí direito a pergunta, o correto é este:

BigDecimal bd = new BigDecimal(235235236226.345363D);

BigDecimal bd2 = new BigDecimal(33434.663D);
		
BigDecimal result = new BigDecimal(bd.doubleValue() % bd2.doubleValue());
		
System.out.println(result);

Se estiver usando Java 5.0 ou superior, a resposta correta é o método “remainder” (remainder = resto em português).

import java.math.BigDecimal;

class RestoDivisaoBD {
    public static void main(String[] args) {
        BigDecimal bd1 = new BigDecimal ("30.659");
        BigDecimal bd2 = new BigDecimal ("1.333");
        BigDecimal bd3 = bd1.remainder (bd2); 
        System.out.println (bd3); // 0.000 exatamente!
        bd1 = new BigDecimal ("12.345");
        bd2 = new BigDecimal ("3.45");
        System.out.println (bd1.remainder (bd2)); // 1.995, como esperado
    }
}

Valeu thingol,

Eu ate tinha testado o remainder, mas como nao estava dando zero, eu pensei que deveria ser de outra forma. o problema e quando eu construia o objeto BigDecimal passando um double como parametro. Mas passando o valor como String, como vc fez, da o resultado esperado.

Agora pra mim ainda e estranho:

		BigDecimal A = new BigDecimal( 30.659 );
		BigDecimal B = new BigDecimal( 1.333 );
		
		System.out.println( ":&gt " + A );
		System.out.println( ":&gt " + B );
		
		BigDecimal C = A.remainder( B );

		System.out.println( ":&gt " + C );

Resultar em:

:&gt 30.65899999999999891997504164464771747589111328125
:&gt 1.3329999999999999626965063725947402417659759521484375
:&gt 1.3329999999999997406519014475634321570396423339843750

Eu sei que tem a ver com a representacao do tipo primitivo double, mas ainda assim acho errado um valor declarado explicitamente resultar em outro.

Por isso é recomendado, dentro da medida do possível, nunca usar o construtor de BigDecimal que recebe um “double”.
Só usar se você souber exatamente o que está fazendo (o que não era seu caso :stuck_out_tongue: )
Normalmente ele faz isso mesmo, e é um comportamento esperado, já que o “double” é representado internamente em binário, não em decimal, e o BigDecimal faz a conversão exata do binário (que é o valor, mostrado em decimal, “30.65899999999999891997504164464771747589111328125” para decimal. )

Na verdade eu ate sabia o que estava fazendo :wink: , so nao tinha certeza do metodo adequado para obter o resto da divisao e tinha me esquecido do tratamento dado ao tipo doble pelo Java, que reafirmo nao concordar.

Mas obrigado pela ajuda :thumbup:

Acho que o compilador deveria mostrar um warning bem grande e medonho ao se usar o construtor de BigDecimal que aceita um double.
Esse construtor nem deveria existir, ou então, só deveria existir um que exigisse também um parâmetro que indicasse a precisão adequada para a conversão.