# BigDecimal em Java: como representar números de vírgula flutuante com precisão

Com a classe `BigDecimal` do Java, é possível lidar com precisão com números de ponto flutuante complexos. Para isso, primeiro é necessário criar esses números e, em seguida, utilizar vários métodos que permitem trabalhar com eles. A sintaxe de cada método geralmente mantém uma estrutura semelhante, o que facilita a utilização da classe após um breve treinamento, mesmo no caso de iniciantes.

## O que é BigDecimal em Java?

Em Java, `BigDecimal` é uma classe que permite representar e processar com grande precisão **números de ponto flutuante complexos de tamanho (em teoria) ilimitado**. Através de diferentes métodos, é possível implementar com máxima precisão operações de arredondamento, aritmética, conversão de formato, hashing e comparações avançadas.

Java `BigDecimal` consiste numa **escala inteira de 32 bits** e um **valor inteiro não escalonado** com precisão arbitrária. Neste contexto, «escala» refere-se ao número de dígitos após a vírgula decimal, desde que estes sejam maiores ou iguais a zero. Se o valor for menor que zero, ele é multiplicado por “10^(-escala)”. O tamanho máximo da classe é limitado apenas pela memória do computador. No entanto, trata-se de uma limitação principalmente teórica, pois é improvável que um programa crie um número que exceda a memória disponível. Enquanto `BigDecimal` em Java é destinado exclusivamente a números de vírgula flutuante, `BigInteger` é usado para números inteiros.

## Para que serve a aula?

Embora nem sempre seja necessário recorrer ao Java `BigDecimal`, há situações e áreas em que essa classe é especialmente valiosa. Por exemplo, ela é usada em cálculos em que até mesmo a posição decimal mais distante pode ter um grande impacto, como nas transações de comércio eletrónico. Também é usada em análises estatísticas precisas. Além disso, há um grande número de programas, como os utilizados no **controlo e navegação de aviões ou foguetes**, que dependem desta classe. Por sua vez, no **âmbito da saúde** também se recorre ao Java `BigDecimal`.

## Como se cria um objeto?

Se quiser usar `BigDecimal` em Java, primeiro deve **importar a classe para o programa Java**. Depois de fazer isso, pode declarar um **objeto dessa classe**, atribuir-lhe o valor desejado como argumento e passá-lo para o construtor Java correspondente. Em seguida, pode usar os `BigDecimals` criados em Java. A seguir, mostramos como importar a classe e declarar dois objetos de exemplo:

```java
/ / Programa de Java para la clase BigDecimal
import java.math.BigDecimal;
public class ejemplo BigDecimal
{
	public static void main(String[] args)
	{
		/ / Crear dos nuevos BigDecimals 
		BigDecimal ejemplouno =
			new BigDecimal ("1275936001.744297361");
		BigDecimal ejemplodos =
			new BigDecimal ("4746691047.132719503");
	}
}
```

Agora pode utilizar estes objetos com os métodos da classe que desejar.

## Exemplos de BigDecimal em Java

Depois de criar os objetos, são utilizados diferentes métodos para executar operações e poder utilizar os objetos. Através de exemplos simples, apresentamos como esses métodos funcionam e quais resultados você pode obter. Com o comando Java `System.out.println()` , uma linha de texto é impressa na saída padrão.

### Soma de dois BigDecimals

Para somar dois BigDecimals em Java, utiliza-se o método **add()**. Primeiro, indique os dois valores que deseja somar. No nosso exemplo, o valor «ExemploUm» deve ser somado ao valor «ExemploDois». Isto tem o seguinte aspecto:

```java
EjemploUno =
EjemploUno.add(EjemploDos);
System.out.println ("El resultado después de la suma es: " + EjemploUno);
```

### Subtrair números

Para subtrair dois valores, é necessário utilizar o método **subtract()**. No exemplo a seguir, “ExemploDois” é subtraído de “ExemploUm”. O código é o seguinte:

```java
EjemploUno =
EjemploUno.restar(EjemploDos);
System.out.println ("El resultado que buscas después de la resta es: " + EjemploUno);
```

### Multiplicar valores

O método usado para multiplicar dois BigDecimals em Java é muito semelhante aos de somar ou subtrair. É chamado **multiply()** e usa como argumento o objeto “multiplicador”. Se quiser multiplicar “ExemploDois” por “ExemploUm”, o código que deve ser usado é:

```java
EjemploUno =
EjemploUno.multiplicar(EjemploDos);
System.out.println ("El resultado después de la multiplicación es: " + EjemploUno);
```

### Dividir números

Para dividir dois BigDecimals em Java, utilize o método **divide()**. A sintaxe continua sendo muito semelhante à de outros métodos e pode ser apresentada da seguinte forma:

```java
EjemploUno =
EjemploUno.divide(EjemploDos);
System.out.println ("El resultado que buscas después de la división es: " + EjemploUno);
```

No entanto, só será obtido um resultado se este for **exato ou se for um número inteiro**. Caso contrário, aparecerá a seguinte mensagem de erro: `java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result`, que descreve um erro em tempo de execução. Para evitar esta mensagem, podem ser aplicadas diferentes opções de arredondamento, que podem ser partilhadas com **java.math.RoundingMode**. Existem diferentes constantes à escolha:

<table>
  <thead>
    <tr>
      <th><strong>Constante</strong></th>
      <th><strong>Função</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>CEILING</td>
      <td>Arredondamento positivo para o infinito.</td>
    </tr>
    <tr>
      <td>DOWN</td>
      <td>Arredondamento para 0.</td>
    </tr>
    <tr>
      <td>FLOOR</td>
      <td>Arredondamento para o infinito negativo.</td>
    </tr>
    <tr>
      <td>HALF\_DOWN</td>
      <td>Arredondamento para o número vizinho seguinte e para o oposto de 0, se ambos estiverem à mesma distância.</td>
    </tr>
    <tr>
      <td>HALF\_EVEN</td>
      <td>Arredondamento para o número vizinho seguinte e para o número par seguinte, se ambos estiverem à mesma distância.</td>
    </tr>
    <tr>
      <td>HALF\_UP</td>
      <td>Arredondamento para o número vizinho seguinte na direção de 0, desde que ambos estejam à mesma distância.</td>
    </tr>
    <tr>
      <td>UNNECESSARY</td>
      <td>Omite o arredondamento e realiza apenas operações exatas. Só pode ser utilizado se a divisão for exata.</td>
    </tr>
    <tr>
      <td>UP</td>
      <td>Arredondamento a partir de 0.</td>
    </tr>
  </tbody>
</table>

## Resumo dos métodos mais importantes

Depois de aprender a utilizar BigDecimals em Java, bem como os diferentes métodos associados, apresentamos a seguir alguns dos métodos mais importantes.

<table>
  <thead>
    <tr>
      <th><strong>Método</strong></th>
      <th><strong>Função</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>abs()</td>
      <td>BigDecimal com o valor absoluto deste BigDecimal.</td>
    </tr>
    <tr>
      <td>add()</td>
      <td>Retorna um BigDecimal cujo valor é a soma de (this + Sumando).</td>
    </tr>
    <tr>
      <td>divide()</td>
      <td>O valor da saída é obtido através de (this / Divisor).</td>
    </tr>
    <tr>
      <td>max(BigDecimal val)</td>
      <td>Retorna o valor máximo deste BigDecimal.</td>
    </tr>
    <tr>
      <td>min(BigDecimal val)</td>
      <td>Retorna o valor mínimo deste BigDecimal.</td>
    </tr>
    <tr>
      <td>movePointLeft(int n)</td>
      <td>Retorna um BigDecimal com o ponto decimal deslocado para a esquerda pelo valor “n”.</td>
    </tr>
    <tr>
      <td>movePointRight(int n)</td>
      <td>Retorna um BigDecimal com o ponto decimal deslocado para a direita pelo valor “n”.</td>
    </tr>
    <tr>
      <td>multiply(BigDecimal multiplicando, MathContext mc)</td>
      <td>Retorna um valor que resulta de (this \* Multiplicador).</td>
    </tr>
  </tbody>
</table>

Dica No Guia Digital, pode encontrar mais informações sobre Java: por exemplo, conheça os operadores Java e descubra as diferenças entre [Java e JavaScript](https://www.ionos.com/pt-pt/digitalguide/paginas-web/desenvolvimento-web/java-vs-javascript/) ou entre [Java e Python](https://www.ionos.com/pt-pt/digitalguide/paginas-web/desenvolvimento-web/python-vs-java/).


This is a markdown version of: [https://www.ionos.com/pt-pt/digitalguide/paginas-web/desenvolvimento-web/bigdecimal-em-java/](https://www.ionos.com/pt-pt/digitalguide/paginas-web/desenvolvimento-web/bigdecimal-em-java/) for AI/LLM consumption.