Lendo Dados do Teclado



Documentos relacionados
Roteiro 1: Dados, variáveis, operadores e precedência

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

2ª LISTA DE EXERCÍCIOS CLASSES E JAVA Disciplina: PC-II. public double getgeracaoatual() {return geracaoatual;}

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

Orientação a Objetos

13 Números Reais - Tipo float

Criar a classe Aula.java com o seguinte código: Compilar e Executar

Introdução. A Informação e sua Representação (Parte III) Universidade Federal de Campina Grande Departamento de Sistemas e Computação

Introdução aos cálculos de datas

3 Classes e instanciação de objectos (em Java)

Faculdade de Ciências Universidade Agostinho Neto Departamento de Matemática e Engenharia Geográfica Ciências da Computação

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

2 Orientação a objetos na prática

Linguagem de Programação III

20 Caracteres - Tipo char

&XUVRGH,QWURGXomRDR (GLWRUGH3ODQLOKDV([FHO

Variáveis e Comandos de Atribuição

Noções sobre Objetos e Classes

JSP - ORIENTADO A OBJETOS

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

Introdução à Programação

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento Eclipse Introdução à Linguagem de Programação JAVA

Organização e Arquitetura de Computadores I

CONVENÇÃO DE CÓDIGO JAVA

UNIVERSIDADE FEDERAL DO PARANÁ

Algoritmia e Programação APROG. Linguagem JAVA. Básico. Nelson Freire (ISEP DEI-APROG 2012/13) 1/31

1. Introdução ao uso da calculadora

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento NetBeans Introdução à Linguagem de Programação JAVA

Organização de programas em Java. Vanessa Braganholo

Conceitos de Linguagens de Programação

Introdução a Computação

Algoritmo. Linguagem natural: o Ambígua o Imprecisa o Incompleta. Pseudocódigo: o Portugol (livro texto) o Visualg (linguagem) Fluxograma

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

Representação de Dados

Aluísio Eustáquio da Silva

Desenvolvimento OO com Java 3 Estruturas de Controle e Programação Básica

Algoritmos e Programação Estruturada

Unidade IV: Ponteiros, Referências e Arrays

Java - Introdução. Professor: Vilson Heck Junior. vilson.junior@ifsc.edu.br

MC-102 Aula 17 Strings e Matrizes

public Agenda() { compromissos = null; } public int getnumerodecompromissos() { if (compromissos==null) return 0; else return compromissos.

Linguagem algorítmica: Portugol

Curso: Técnico de Informática Disciplina: Redes de Computadores. 1- Apresentação Binária

Unidade 5: Sistemas de Representação

Capítulo 2: Introdução à Linguagem C

INF 1005 Programação I

Tipos de Dados Simples

Sistemas de Numeração. Professor: Rogério R. de Vargas INFORMÁTICA 2014/2

UNIVERSIDADE FEDERAL DO PARANÁ

Conceitos básicos da linguagem C

Computação II Orientação a Objetos

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Prof. Esp. Adriano Carvalho

Linguagem e Técnicas de Programação I Operadores, expressões e funções. Prof. MSc. Hugo Souza Material desenvolvido por: Profa.

Resumo da Matéria de Linguagem de Programação. Linguagem C

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

Capítulo 13. VARIÁVEIS DO TIPO REAL DUPLA

REPRESENTAÇÃO DE DADOS EM SISTEMAS DE COMPUTAÇÃO AULA 03 Arquitetura de Computadores Gil Eduardo de Andrade

Algoritmos I Aula 13 Java: Tipos básicos, variáveis, atribuições e expressões

Estrutura de Dados Básica

Java 2 Standard Edition Como criar classes e objetos

Conversão de Tipos e Arrays

AULA Uma linguagem de programação orientada a objetos

CURSO DE ACCESS AULA 2 Criando o Banco de Dados

2. OPERADORES ALGORITMOS, FLUXOGRAMAS E PROGRAMAS FUNÇÕES... 10

AULA 12 CLASSES DA API JAVA. Disciplina: Programação Orientada a Objetos Professora: Alba Lopes alba.lopes@ifrn.edu.br

Sintaxe Básica de Java Parte 1

Identificação das variáveis de entrada; resultados/variáveis de saída e método ou solução. (procedimentos e funções)

Java Como Programar, 8/E

Estruturas de Repetição

5 Apresentando a linguagem C

CONCEITOS BÁSICOS PARA A CONSTRUÇÃO DE ALGORITMOS PARA COMPUTADORES. Isac Aguiar isacaguiar.com.br isacaguiar@gmail.com

Algoritmos com VisuAlg

Exemplos. char c; int i=67;... c= A ; c=c+1; if (c== B )... c=i; i=c; i++; if (i>= C )...

INTRODUÇÃO AO JAVA PARA PROGRAMADORES C

DEFINIÇÃO DE MÉTODOS

Algoritmos e Estruturas de Dados I 01/2013. Arquivos. Pedro O.S. Vaz de Melo

Programação Orientada a Objetos! Java - Fundamentos. Prof. Sérgio Almagro! sergio.ricardo.almagro@gmail.com

Linguagem de Programação I

1. FUNÇÕES NO EXCEL 2007

Java Como Programar, 8/E

Programação de Computadores

Curso: Ciência da Computação Disciplina: Construção de Compiladores Período: Prof. Dr. Raimundo Moura

Especialização em desenvolvimento para web com interfaces ricas. Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares

Algoritmos e Programação. Curso de Engenharia de Produção Prof. Ms. Rogério Cardoso rogerio.cardoso@aedu.com professor@rogeriocardoso.com.

Algoritmos e Programação _ Departamento de Informática

ESTRUTURA CONDICIONAL

BC0501 Linguagens de Programação

Para desenvolver a atividade a atividade desta aula utilizaremos o ambiente de desenvolvimento integrado NetBeans.

Aula 04 Operadores e Entrada de Dados. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Resolução de problemas e desenvolvimento de algoritmos

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Orientação a Objetos

Introdução. A Informação e sua Representação (Parte II) Universidade Federal de Campina Grande. Unidade Acadêmica de Sistemas e Computação

CIÊNCIA DA COMPUTAÇÃO I Excel. Núm1, núm2,... são argumentos de 1 a 255 cuja soma ou valor total você deseja obter.

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

LÓGICA DE PROGRAMAÇÃO. Vitor Valerio de Souza Campos

Transcrição:

Entrada 14 e Saída: Lendo Dados do Teclado 14.7 Formatando a saída Os valores de saída normalmente são produzidos sem formatação. Em particular, os valores numéricos exibem o número de casas decimais resultantes das operações sobre eles realizadas. Assim a expressão 1f/21 resulta no valor 0.04761905 (o número de casas decimais e o arredondamento depende do valor resultante e do tipo primitivo utilizado). Em várias ocasiões precisamos formatar a saída para, por exemplo, imprimir valores com um número predeterminado de casas decimais. A linguagem Java oferece um série de alternativas para produzir valores de saída formatados. 14.7.1 O método printf A classe PintStream possui o método printf que permite a formatação de uma cadeia de caracteres segundo diretivas de formatação. Este método recebe como argumentos uma cadeia de caracteres contendo as diretivas de formatação e os objetos que serão impressos segundo essas diretivas. PrintStream printf(string formato, Object arg...) Produz a saída correspondente aos objetos arg (as reticências indicam que podem ser fornecidos vários objetos) formatados segundo as diretivas em formato. A cadeia de caracteres que especifica a formatação contém caracteres fixos, que serão impressos como aparecem, e diretivas de formatação. As diretivas de formatação são indicadas pelo caractere %. Para cada diretiva de formatação deve existir um argumento. Exceto quando a diretiva indica um argumento específico, a primeira diretiva é aplicada

2 Entrada e Saída: Lendo Dados do Teclado ao primeiro argumento, a segunda diretiva é aplicada ao segundo argumento, e assim por diante. Os argumentos excedentes simplesmente não são impressos. Exemplo 14.1. A cadeia "Exemplo %f de cadeia %,d %.3f de formatacao" possui três diretivas de formatação: %f, %,d e %.3f. Os demais caracteres são impressos da forma como aparecem. Se esta cadeia for usada para formatar os valores 45.6721 e 2367, como em: System.out.printf("Exemplo %f de cadeia %,d %.3f de formatacao", 45.6721, 2367, 45.6721); teremos a seguinte saída: Exemplo 45,672100 de cadeia 2.367 45,672 de formatacao Os caracteres fixos, incluindo os espaços, são impressos exatamente do modo como aparecem na cadeia de formatação. Os valores dos argumentos são formatados segundo a diretiva aplicada a cada um deles. Ao primeiro argumento é aplicada a diretiva %f, que apenas faz com que o valor seja impresso no formato de um número real; A diretiva %,d é aplicada ao segundo argumento, formatando-o com o separador de milhar, e a diretiva %.3f é aplicada ao terceiro argumento, formatando-o com três casas decimais. Para cada diretiva deve existir um argumento de um tipo compatível com o especificado na diretiva. Se são fornecidos mais argumentos que os especificados nas diretivas, os argumentos adicionais são ignorados. Ocorre um erro (da classe IllegalFormatException) se os argumentos não são compatíveis ou se a quantidade de argumentos é menor que o especificado na diretiva. A quantidade de argumentos pode ser zero se a cadeia de formatação não contiver diretivas. Diretiva de formatação Cada diretiva de formatação especifica uma forma de conversão, usada para transformar o argumento em uma cadeia de caracteres cujo conteúdo corresponda ao valor do argumento. A estrutura de uma diretiva de formatação é a seguinte: Diretiva ::= % [ PosArg ] [ Apres ] [ Tamanho ] [ Precisão ] Conversão onde PosArg indica a posição do argumento ao qual a diretiva é aplicada, Apres indica a forma de apresentação do argumento (alinhamento, uso de sinal, etc. ), Tamanho indica a quantidade mínima de caracteres usadas na formatação, Precisão indica a quantidade de casas decimais e Conversão indica a conversão a ser aplicada ao argumento. Todos os termos, exceto o indicador de conversão e caractere %, são opcionais.

14.7 Formatando a saída 3 Tabela 14.1. Caracteres de conversão de uma diretiva de formatação caractere classe descrição b B Geral Se o argumento é nulo, então o resultado é a cadeia "false". Se o argumento representa um valor booliano, então o resultado é a cadeia correspondente a esse valor. Nos demais casos, o resultado é a cadeia "true". h H Geral Se o argumento é nulo, então o resultado é "null". Em caso contrário, o resultado é um inteiro correspondente ao código da tabela hash que identifica o objeto. s S Geral Se o argumento é nulo resulta na cadeia "null". Se o argumento implementa um objeto formatável (interface Formattable), então o resultado é a chamada arg.toformat(). Nos demais casos resulta na conversão do argumento em uma cadeia de caracteres (usando-se o método arg.tostring() se arg for um objeto). c Caractere Resultado formatado como um caractere Unicode. d Inteiro Resultado formatado como um inteiro. o Inteiro Resultado formatado como um inteiro octal. x X Inteiro Resultado formatado como um inteiro hexadecimal. f Real Resultado formatado como um real em notação decimal. e E Real Resultado formatado como um real em notação científica. g G Real Resultado formatado como um real em notação decimal ou em notação científica dependendo da precisão ou do valor após o arredondamento. a A Real Resultado formatado como hexadecimal em notação exponencial. t T Data/Hora Resultado formatado como data/tempo. % Percentual Produz o literal % ( \u0025 ). n Fim de linha Produz um caractere de fim de linha.

4 Entrada e Saída: Lendo Dados do Teclado Indicador de conversão A conversão do argumento é indicada pelos caracteres de conversão da Tabela 14.1: Exemplo 14.2. O programa 1 import java.util.*; 2 class C14ExemploF2 { 3 public static void main(string[] arg) { 4 boolean res = true; 5 System.out.printf("%b %B%n", null, res); 6 Scanner tec = new Scanner(System.in); 7 System.out.printf("%h %H %n", tec, null); 8 Float objf = new Float(230.32); 9 System.out.printf("%s %S %n", objf, tec); 10 char c = d ; 11 System.out.printf("%c %c %n", c, a ); 12 int numi = 1234; 13 System.out.printf("%d %o %X %n",numi, numi, numi); 14 double numr = 1234.5677; 15 System.out.printf("%f %e %G %A %n",numr, numr, numr, numr); 16 System.out.printf("fixo%%"); 17 } 18 } produz a seguinte saída: false TRUE 3e25a5 NULL 230.32 JAVA.UTIL.SCANNER[DELIMITERS=\P{JAVAWHITESPACE}+][POSITION=0] [MATCH VALID=FALSE][NEED INPUT=FALSE][SOURCE CLOSED=FALSE] [SKIPPED=FALSE][GROUP SEPARATOR=\.][DECIMAL SEPARATOR=\,] [POSITIVE PREFIX=][NEGATIVE PREFIX=\Q-\E][POSITIVE SUFFIX=] [NEGATIVE SUFFIX=][NAN STRING=\Q?\E][INFINITY STRING=\Q?\E] d a 1234 2322 4D2 1234,567700 1.234568e+03 1234.57 0X1.34A45532617C2P10 fixo% Os comandos System.out.printf ilustram algumas das conversões da Tabela 14.1. O salto de linha é produzido pela diretiva %n. O valor 3e25a5 produzido pelo comando da linha 7 corresponde ao código da tabela hash que identifica o objeto criado na linha 6. O valor 230.32 produzido pelo comando da linha 9 corresponde ao resultado de objf.tostring() e o restante da linha impressa, de JAVA.UTIL até STRING=\Q?\E], corresponde ao resultado de tec.tostring(). A letra P produzida pela diretiva %A no comando da linha 15 indica o expoente da notação real hexadecimal. As descrições da Tabela 14.1 são suficientes para a compreensão das demais conversões deste programa.

14.7 Formatando a saída 5 Posição do argumento As diretivas podem indicar o argumento ao qual serão aplicadas de modo explícito, fornecendo a posição do argumento como um inteiro seguido do caractere $. O primeiro argumento é indicado por 1$, o segundo por 2$, e assim por diante. Pode-se usar o caractere < para indicar que a diretiva é aplicada ao mesmo argumento da diretiva anterior. Quando não existe a indicação explícita de um argumento, então considera-se que existe uma indicação implícita que começa com o primeiro argumento. A primeira diretiva com indicação implícita refere-se sempre ao primeiro argumento, a segunda refere-se sempre ao segundo argumento, e assim por diante. Exemplo 14.3. O comando System.out.printf("%3$f %f %4$d %d %<d", 10.0, 20, 30.0, 40); produz a seguinte saída: 30,000000 10,000000 40 20 20 A primeira diretiva contém a indicação explícita do argumento ao qual é aplicada (o terceiro) e produz a saída 30,000000. A segunda diretiva é aplicada ao primeiro argumento porque é a primeira diretiva sem indicação explícita de argumento; produz a saída 10,000000. A terceira diretiva é aplicada ao quarto argumento e produz a saída 40. A quarta diretiva é aplicada ao segundo argumento porque é a segunda diretiva sem indicação explícita de argumento; produz a saída 20. A última diretiva indica explicitamente que deve ser aplicada ao mesmo argumento que a diretiva anterior. Indicador de tamanho O tamanho mínimo da saída pode ser indicado por um inteiro positivo. Se o valor após a conversão possuir mais caracteres que o mínimo, a limitação de tamanho não será aplicada. Se possuir menos caracteres, então serão usados caracteres adicionais. Geralmente são adicionados espaços à esquerda, mas esse comportamento pode ser mudado pelo indicador de apresentação. Precisão A precisão é indica por um ponto seguido de um inteiro. Classe geral. Para as conversões b, B, h, H, s e S a precisão define o total de caracteres da saída. Classe real. Para as conversões e, E e F a precisão indica o número de casas após o ponto decimal. Para g e G, indica o número total de dígitos na magnitude após o arredondamento. Para a e A a precisão não deve ser especificada.

6 Entrada e Saída: Lendo Dados do Teclado Demais classes. A precisão não deve ser especificada para caracteres (c), inteiros (d, o, x e X), data/hora (t e T), caractere % e fim de linha (\n). Indicador de apresentação O indicador de apresentação é usado para modificar a aparência do resultado, sendo aplicado a alguns tipos de conversão. -. Produz saídas alinhadas à esquerda. Aplicado às conversões das classes geral, caractere, inteiro, real e data/hora. #. Produz o resultado em modo alternativo. Aplicado a conversões das classes geral, inteiro (apenas para o, x e X ) e real. +. Produz sempre o sinal do número. Aplicado para conversões das classes real e inteiro (apenas para d, quando o objeto for de um tipo primitivo, ou para d, o, x e X, quando o argumento for da classe BigInteger).. Inclui espaços frontal para valores positivos. Aplicado a conversões das classes real e inteiro (apenas para d, quando o objeto for de um tipo primitivo, ou para d, o, x e X, quando o argumento for da classe BigInteger). 0. Inclui zeros à esquerda para atingir o tamanho mínimo. Aplicado a conversões das classes real e inteiro.,. Inclui separadores de grupos (depende da localização do ambiente). Aplicado a conversões das classes inteiro (apenas para d ) e real (apenas para e, E, f, g e G ). (. Coloca números negativos entre parênteses. Aplicado a conversões da classes real (apenas para e, E, f, g e G ) e inteiro (apenas para d, quando o objeto for de um tipo primitivo, ou para d, o, x e X, quando o argumento for da classe BigInteger). Exemplo 14.4. A tabela a seguir mostra o resultado do comando System.out.printf para diferentes argumentos. As variáveis estão definidas como: String frase = "A Josefa pode ficar brava"; double num = 234.678591; int numi = 7364; int numn = -571;

14.7 Formatando a saída 7 argumentos saída resultante ("%.13s", frase) A Josefa pode O conteúdo de frase é limitado a 13 caracteres. ("%20.13s", frase) A Josefa pode Após a limitação do conteúdo de frase, são incluídos espaços para completar os 20 caracteres de tamanho mínimo. ("%-20.13sTxt%n", frase) A Josefa pode Txt A saída continua com 20 caracteres, mas o conteúdo é alinhado à esquerda. ("%.3f", num) 234,679 O valor é produzido com 3 casas decimais, havendo arredondamento. ("%4.3f", num) 234,679 O tamanho mínimo não tem efeito porque a conversão e precisão resultam em uma saída com 7 casas decimais. ("% 4.3f", num) 234,679 É incluído um espaço frontal. ("%10.3f", num) 234,679 São incluídos 3 espaços iniciais para completar o tamanho mínimo de 10 caracteres. ("%010.3f", num) 000234,679 Zeros são usados para completar o tamanho mínimo. ("%+10.3f", num) +234,679 O sinal é sempre produzido. ("%.0f", num) 235 O valor resultante é produzido sem casas decimais. ("%.9f", num) 234,678591000 São incluídos zeros à direita para completar o número de 9 casas decimais. ("%15.9f", num) 234,678591000 São incluídos zeros à direita para completar as 9 casas decimais, e espaços à esquerda para completar o tamanho mínimo de 15 caracteres. ("%x %#x",numi, numi) 1cc4 0x1cc4 A segunda diretiva imprime numi na forma alternativa, indicando que se trata de um valor hexadecimal. ("%,d",numi) 7.364 A saída é produzida com separador de milhar. ("%d %(d",numn, numn) -571 (571) A segunda diretiva produz a saída entre parênteses. As situações que a tabela ilustra mostram que a saída resultante é produzida em etapas. Primeiro ocorre a conversão do argumento, seguindo-se a definição da precisão e por último o tamanho mínimo é considerado. A formatação para atender o indicador de apresentação ocorre por último. 14.7.2 Formatando datas Os caracteres t e T indicam a conversão de datas e horas, expressas como objetos da classe Date ou Calendar ou como valores do tipo long. O formato a ser utilizado na conversão é indicado por um caractere adicional. A Tabela 14.7.2 mostra alguns dos caracteres que podem ser usados.

8 Entrada e Saída: Lendo Dados do Teclado Tabela 14.2. Caracteres para formatação de data e hora H Hora do dia no formato 24h, com dois dígitos. k Hora do dia no formato 24h. I Hora do dia no formato 12h, com dois dígitos. l Hora do dia no formato 12h. M Minutos com dois dígitos (00-59). S Segundos com dois dígitos (00-60). p Período como am ou pm. B Nome completo do mês (depende da localização) b h Nome abreviado do mês (depende da localização) A Nome completo da semana. a Nome abreviado da semana. C Século. Corresponde ao ano com quatro dígitos dividido por 100 (formatado com dois dígitos). Y Ano com quatro dígitos. y Ano com dois dígitos. j Dia do ano com três dígitos 001 a 366. m Mês com dois dígitos 01 a 13. d Dia do mês com dois dígitos, 01 a 31. e Dia do mês, 1 a 31. R Formato 24h correspondendo a "%th:%tm" T Formato 24h correspondendo a "%th:%tm:%ts" r Formato 12h correspondendo a "%ti:%tm:%ts %Tp" D Data formatada como "%tm/%td/%ty"

14.8 Usando números com formato fixo 9 Exemplo 14.5. O programa 1 import java.util.*; 2 import java.util.calendar.*; 3 class C14ExemploF5 { 4 public static void main(string[] arg) { 5 Date dt = new Date(); 6 Calendar data = Calendar.getInstance(); 7 System.out.println(dt); 8 System.out.printf("%tH horas de %<ta %n",dt); 9 System.out.printf("%tD %n",dt); 10 System.out.printf("%tT %n",dt); 11 System.out.printf("hoje: %td de %<tb de %<ty %n",data); 12 System.out.printf("%tD %n",data); 13 System.out.printf("%tT %n",data); 14 } 15 } produz a seguinte saída: Sun Dec 17 23:38:34 BRST 2006 23 horas de Domingo 12/17/06 23:38:34 hoje: 17 de Dezembro de 2006 12/17/06 23:38:34 Os comandos das linhas 5 e 6 criam objetos Date e Calendar refletindo a data e hora do momento em que foram criados. O comando de impressão da linha 7 mostra a representação do objeto dt como uma cadeia de caracteres. Os comandos das linhas 8 a 13 ilustram algumas das diretivas de formatação de datas aplicadas aos objetos dt e data. Os comandos das linhas 8 e 11 usam o caractere < para indicar que a diretiva é aplicada ao mesmo argumento que a diretiva anterior. 14.8 Usando números com formato fixo Em algumas situações é necessário trabalhar com números de formato fixo, considerandoos, por exemplo, como se tivessem todos apenas duas casas decimais. Nestes casos, a formatação produzida pelo método printf é de pouca valia porque não afeta o modo como os números são armazenados. Podemos, entretanto usar a classe BigDecimal que permite representar números reais de tamanho e precisão arbitrárias. Os números representados por objetos da classe BigDecimal são determinados por um valor inteiro, representando o número sem casas decimais, e uma escala, representando a

10 Entrada e Saída: Lendo Dados do Teclado quantidade de casas decimais que deve existir após o ponto decimal. Assim, um número BigDecimal com magnitude m e escala e representa o valor m 10 e. Os objetos da classe BigDecimal são criados fornecendo-se como argumento o valor correspondente ao número: new BigDecimal(4.547). Cria o objeto correspondente ao número 4.547. new BigDecimal("4.583"). Cria o objeto correspondente ao número 4.583. new BigDecimal(53.5/3). 53.5/3. Cria o objeto que corresponde ao resultado da operação Quando um objeto BigDecimal é criado sua escala assume o valor necessário para representá-lo. Nos dois primeiros exemplos acima a escala é 3. Já no terceiro exemplo o objeto é criado com uma escala 48, pois representa o número 17.833333333333332149095440399833023548126220703125. 14.8.1 Determinando a escala Para criar um objeto com um número predefinido de casas decimais devemos explicitamente determinar sua escala usando o método setscale. Este método não modifica o objeto que o executa, apenas retorna um novo objeto que corresponde àquele que executa o método, com o número especificado de casas decimais. BigDecimal nx = (new BigDecimal(4.547)).setScale(5). Cria o objeto correspondente ao número 4.54700. ny = ny.setscale(5). Armazena em ny um novo objeto, que corresponde a ny (antes da atribuição) com 5 casas decimais. nr = ny.setscale(3). Armazena em nr o objeto que corresponde a ny com 3 casas decimais. O objeto ny permanece inalterado. 14.8.2 Política de arredondamento Quando se determina a escala de um objeto BigDecimal, ocorre um erro (da classe ArithmeticException) se for necessário arredondar o valor resultante e a política de arredondamento não estiver especificada. Para evitar o erro devemos determinar a escala informando também a política de arredondamento a ser adotada. A classe BigDecimal possui variáveis estáticas que indicam a política de arredondamento:

14.8 Usando números com formato fixo 11 ROUND DOWN Arredonda para baixo. Exemplo: 1, 239 1, 23. ROUND UP Arredonda para cima. Exemplo: 1, 232 1, 24. ROUND HALF DOWN Arredonda para o vizinho mais próximo. Se os vizinhos forem eqüidistantes arredonda para baixo. Exemplo 1, 239 1, 24, 1, 234 1, 23 e 1, 235 1, 23. ROUND HALF UP Arredonda para o vizinho mais próximo. Se os vizinhos forem eqüidistantes arredonda para cima. Exemplo 1, 239 1, 24, 1, 234 1, 23 e 1, 235 1, 24. ROUND HALF EVEN Arredonda para o vizinho mais próximo. Se os vizinhos forem eqüidistantes arredonda para o vizinho par. Exemplo 1, 239 1, 24, 1, 234 1, 23 e 1, 235 1, 24, 1, 225 1, 22. 14.8.3 Operações com BigDecimal As operações envolvendo objetos BigDecimal devem ser realizadas através dos métodos da classe BigDecimal. Deve-se observar que o resultado das operações é um novo objeto. BigDecimal add(bigdecimal b). Quando executado por a retorna um novo objeto que corresponde a a + b. A escala é igual à maior dentre as escalas de a e b. BigDecimal subtract(bigdecimal b). Quando executado por a retorna um novo objeto que corresponde a a - b. A escala é igual à maior dentre as escalas de a e b. BigDecimal multiply(bigdecimal b). Quando executado por a retorna um novo objeto que corresponde a a * b. A escala é igual à soma das escalas de a e b. BigDecimal divide(bigdecimal b, RoundingMode m). Quando executado por a retorna um novo objeto que corresponde a a / b. A escala é igual à diferença entre as escalas de a e b. O segundo argumento define a política de arredondamento e é necessário nos casos em que o resultado não pode ser calculado de modo exato com o número de casas decimais da escala resultante. BigDecimal pow(int n). Quando executado por a retorna um novo objeto que corresponde a a n. O novo objeto possui a escala necessária para armazenar o resultado exato. Pode-se obter o valor de um tipo primitivo correspondente ao conteúdo de um objeto BigDecimal através dos métodos doublevalue, longvalue e intvalue. Para se obter a representação do número como uma cadeia de caracteres deve-se usar o método tostring. A referência ao próprio objeto também pode ser usada em comandos de impressão. Exemplo 14.6. O programa abaixo lê uma seqüência de 5 valores reais, considerando-os todos com duas casas decimais. Se o valor tiver mais de duas casas decimais deverá ser

12 Entrada e Saída: Lendo Dados do Teclado arredondado. Após a leitura o programa imprime todos os valores lidos divididos pela constante 2.23. 1 import java.math.*; 2 import java.util.*; 3 class C14ExemploF6 { 4 public static void main(string[] arg) { 5 Scanner tec = new Scanner(System.in); 6 BigDecimal[] valor = new BigDecimal[5]; 7 int ard = BigDecimal.ROUND_HALF_EVEN; 8 BigDecimal fator = new BigDecimal(2.23).setScale(2,ard); 9 for (int i=0; i < 5; i++) { 10 valor[i] = (new BigDecimal(tec.nextDouble())).setScale(2,ard); 11 } 12 for (int i=0; i < 5; i++) { 13 System.out.print(valor[i].divide(fator,ard)+" "); 14 } 15 } 16 } Os números são armazenados em um vetor de BigDecimal (linhas 9 a 11). Se os valores lidos forem 2.34, 120.21, 200, 100.98 e 88.44, então o programa produz a seguinte saída: 1.05 53.91 89.69 45.28 39.66 Se os valores fosse armazenados apenas como double, a saída produzida seria: 1.0493273542600896 53.90582959641255 89.68609865470852 45.28251121076234 39.65919282511211 Para melhorar a legibilidade do programa a referência à política de arredondamento é feita através da variável ard, declarada na linha 7. Observe que se usássemos a declaração import static java.math.bigdecimal.* poderíamos usar ROUND HALF EVEN diretamente.