BigDecimal A = new BigDecimal( 30.659 );
BigDecimal B = new BigDecimal( 1.333 );
BigDecimal C = null; // algo do tipo A%B
System.out.println( ":> " + C );
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( ":> " + A );
System.out.println( ":> " + B );
BigDecimal C = A.remainder( B );
System.out.println( ":> " + C );
Resultar em:
:> 30.65899999999999891997504164464771747589111328125
:> 1.3329999999999999626965063725947402417659759521484375
:> 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 )
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 , 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.