Valores float com ponto ou vírgula?

pessoal, depois de muito tempo estou desenferrujando os conhecimentos sabre Java, nossa, como ficar sem estudar enferruja.
Bem, sei que a dúvida é meio trivial, mas não estou entendendo uma coisa, apesar do exemplo estar funcionando bem.
Seguinte, estava revendo alguns tópicos com o livro do Deitel, e no capítulo 6 deparei-me com um exemplo sobre sobrecarga de métodos. Achei muito simples e resolvi mudar.

As classes estão abaixo, desconsiderem os três primeiros métodos da classe MethodOverload:

package packageSobrecarga;

public class MethodOverload
{
	public void testOverloadMethods()
	{
		System.out.printf("Square of integer 7 is %d\n", square(7));
		System.out.printf("Square of double 7,5 is %4.2f\n", square(7.5));
	} // Fim do método testOverloadMethods
	
	public int square( int intValue)
	{
		System.out.printf("\nCalled square with int argument: %d\n", intValue);
		return intValue*intValue;
	}
	
	public double square(double doubleValue)
	{
		System.out.printf("\nCalled square with double value: %f\n", doubleValue);
		return doubleValue*doubleValue;
	}
	
	public float calculaSalario(float salario, float premio)
	{
		float vencimento;
		vencimento = salario + premio;
		return vencimento;
	}
	
	public float calculaSalario(float salario, float vendas, float premio)
	{
		float vencimento;
		vencimento = salario + 0.05f*vendas + premio;
		return vencimento;
	}
	
	
	public float calculaSalario(float salario, float vendas, float premio, float premioGerente)
	{
		float vencimento;
		vencimento = salario + 0.15f*vendas + premio + premioGerente;
		return vencimento;
	}
}
package packageSobrecarga;

import java.util.Scanner;

public class MethodOverloudTest
{
	static float salarioFunc;
	static float salarioGerente;
	static float salarioVendedor;
	static float premioGerente;
	static float premioFunc;
	static float premioVendedor;
	static float vendasVendedor;
	static float vendasGerente;
	static float premio;
	
	Scanner input = new Scanner(System.in);
	
	MethodOverload methodOverload = new MethodOverload();
	
	public static void main(String[] args)
	{
		// Cria objeto da classe MethodOverloudTest
		MethodOverloudTest chamaMetodo = new MethodOverloudTest();
		
		// Invoca método salarioFunc
		chamaMetodo.salarioFunc();
		
		// invoca método salarioVendedor
		
		chamaMetodo.salarioVendedor();
		
		// Invoca método salarioGerente
		
		chamaMetodo.salarioGerente();
	}
	
	// Método para se calcular o salário do funcionário
	public void salarioFunc()
	{
		System.out.println("Informe o salário do funcionário:");
		salarioFunc = input.nextFloat();
		System.out.println("Informe o prêmio do funcionário:");
		premioFunc = input.nextFloat();
		
		// Invoca método da classe MethodOverload para se calcular o salário do funcionário
		float salFunc = methodOverload.calculaSalario(salarioFunc, premioFunc);
		
		// Exibe o salário do funcionário
		System.out.println("O salário do funcionário é: " + salFunc);
	}
	
	// Invoca método para se calcular o salário do vendedor
	
	public void salarioVendedor()
	{
		System.out.println("Informe o salário do vendedor:");
		salarioVendedor = input.nextFloat();
		System.out.println("Informe o prêmio do vendedor:");
		premioVendedor = input.nextFloat();
		System.out.println("Informe as vendas do vendedor:");
		vendasVendedor = input.nextFloat();
		
		// Invoca método da classe MethodOverload para se calcular o salário do vendedor
		float salVend = methodOverload.calculaSalario(salarioVendedor, vendasVendedor, premioVendedor);
		
		// Exibe o salário do vendedor
		
		System.out.println("O salário do vendedor é: " + salVend);
	}
	
	public void salarioGerente()
	{
		System.out.println("Informe o salário do gerente:");
		salarioGerente = input.nextFloat();
		System.out.println("Informe o prêmio");
		premio = input.nextFloat();
		System.out.println("Informe o prêmio do gerente:");
		premioGerente = input.nextFloat();
		System.out.println("Informe as vendas do gerente:");
		vendasGerente = input.nextFloat();
		
		float salGer = methodOverload.calculaSalario(salarioGerente, vendasGerente, premio, premioGerente);
		
		// Exibe o salário do gerente
		
		System.out.println("O salário do gerente é: " + salGer);
	}
}

Bem, como disse, está funcionando bem, mas minha dúvida é na entrada dos dados floats. Devo usar a vírgula como separador de ponto decimal, mas o formato americano faz isso com ponto, certo ? E devo usar o ponto para separar os milhares, mas o formato americano faz isso com a vírgula, certo ?

A seguir mostro a entrada e a saída de um teste que fiz:

Informe o salário do funcionário:
4.750
Informe o prêmio do funcionário:
650,98
O salário do funcionário é: 5400.98
Informe o salário do vendedor:
7.654,97
Informe o prêmio do vendedor:
1.123,80
Informe as vendas do vendedor:
45.654,75
O salário do vendedor é: 11061.508
Informe o salário do gerente:
12.345,98
Informe o prêmio
1.200,00
Informe o prêmio do gerente:
1.345,80
Informe as vendas do gerente:
150.563,34
O salário do gerente é: 37476.285

Notem que na saída o aplicativo mostra os resultados no formato americano, ou seja, o separdaor de ponto decimal é o ponto (.) mesmo.
A minha dúvida está aí, na entrada devo usar um formato e na saida ele apresenta em outro.
Notem agora o erro que ocorre quando tento usar o ponto na entrada de dados para a variável prêmio do funcionário. A entrada e a saída é a seguinte:

Informe o salário do funcionário:
2.345,65
Informe o prêmio do funcionário:
245.76
Exception in thread "main" java.util.InputMismatchException
	at java.util.Scanner.throwFor(Unknown Source)
	at java.util.Scanner.next(Unknown Source)
	at java.util.Scanner.nextFloat(Unknown Source)
	at packageSobrecarga.MethodOverloudTest.salarioFunc(MethodOverloudTest.java:44)
	at packageSobrecarga.MethodOverloudTest.main(MethodOverloudTest.java:27)

Alguém pode explicar isso, por favor ?

Agradecido desde já.

Ola amigo,

Normalmente o float apresenta esses problemas de ponto e virgula mesmo…

o que poderia ser feito é a substituição da virgula por ponto e na saida vc formata para a forma que quiser com o number format ou use a classe bigdecimal para seu exemplo…

Teste também com os wrappers com Float.valueOf(arg0); //esse seu problema pode ser tratado aqui…

Não sei explicar ao certo mas tente também adicionar um f ao final do input no console

Fallow

2 curtidas

Use a classe DecimalFormat. Assim vc especifica exatamente o formato de saída. E pode usar o mesmo formato na entrada através do método parse.

Paulo,
Valeu pela dica, amigo ! Tentarei essa solução.

ViniGodoy,

Opa, você sempre por aqui ajudando os mortais, heim !
Obrigado pela dica, conheço a classe DecimalFormat sim, estava até pesnando em usá-la, mas é que gostaria de saber o por que o problema ocorreu. mas tudo bem, da próxima vez formato a saída com DecimalFormat.
Aliás, estou tendo sérios problemas em uma vídeo aula que adquiri aqui, estava tudo bem, até que a IDE NetBeans resolveu me atrapalhar. O problema é com JTable. Gostaria da sua ajuda e dos demais membros do fórum para resolver. Pesquisei no fórum e notei que você quase perdeu osmcabelos em um tópico onde um membro estava usando DefaultTableModel :lol: (hehehe).
Bem, antes de perguntar eu tenho o incrível mau costume de procurar estudar primeiro (heheh :lol:) para ver se aprendo. Não quero mais ficar refém do Matisse no NetBeans e do VisualEditor do Eclipse, por isso essas coisas quero fazer na mão. Vou estudar e, se não conseguir, coloco aqui minha dúvida, ok ?

Abraços e obrigado !

Ocorre pq a classe Scanner não trata localização. @.@

Na verdade, o ideal é, quando ler do console, usar apenas o método nextLine() e nunca os outros métodos next(). Isso pq esses métodos são feitos para ler dados brutos, não terminados em \n, como sempre ocorre no console.

Caso você os use, você corre o sério risco de deixar lixo dentro do seu scanner, e alguns desses métodos simplesmente não funcionarem de vez enquando.

hummmmm, dados terminados em \n ? Peraí, deixa ver se entendi, quer dizer que os métodos next() têm os mesmos problemas do scanf em C para fazermos a entrada de dados do tipo string naquela linguagem ? Ou seja, scanf deixa lixo nó buffer e devemos dar um getchchar() para resolver ? Acho que era esse mesmo o problema que tive em C quando estava estudando essa linguagem.
Abraços !

[quote=Valder Olmo Corrêa]hummmmm, dados terminados em \n ? Peraí, deixa ver se entendi, quer dizer que os métodos next() têm os mesmos problemas do scanf em C para fazermos a entrada de dados do tipo string naquela linguagem ? Ou seja, scanf deixa lixo nó buffer e devemos dar um getchchar() para resolver ? Acho que era esse mesmo o problema que tive em C quando estava estudando essa linguagem.
Abraços ![/quote]

Exatamente. Copiaram até isso.