Olá,
Alguém sabe me informar como faço para arredondar números??
Exemplo: de 0,0099999 para 0,01
Obrigada
Olá,
Alguém sabe me informar como faço para arredondar números??
Exemplo: de 0,0099999 para 0,01
Obrigada
Olá irisvanda,
Experimente utilizar o método Math.ceil(). Verifique se este atende ao que vc precisa.
double resultado = Math.ceil(0,0099999);
Abraços
Oi,
O ceil arrendondou para 1.0, eu queria que arredonda-se para 0.01
as funções ceil e floor arredondam pra valores inteiros, nesse caso vc vai ter q multiplicar por 100, arredondar e dividir por 100 pra ser do jeito que vc quer, veja se isso resolve seu problema
double round(double numero, int precisao)
{
double aux = 1.0;
// Math.pow(10, precisao);
// como a midp nao tem pow...
for (int i = 0; i < precisao; i++
aux *= 10.0
numero *= aux;
numero = Math.ceil(numero);
numero /= aux;
return numero;
}
flw, t+
quikkoo, isso funciona mas num eh muito instavel nao?
pode-se usar classe NumberFormat para tal…
[quote=gobbo]quikkoo, isso funciona mas num eh muito instavel nao?
pode-se usar classe NumberFormat para tal…[/quote]
se vc escrever essa função pra j2me então pode né, mas no fim das contas essa classe da j2se vai acabar fazendo algo parecido com isso, então eu acho melhor resolver o problema ali mesmo
inté
[quote=quikkoo]
se vc escrever essa função pra j2me então pode né, mas no fim das contas essa classe da j2se vai acabar fazendo algo parecido com isso, então eu acho melhor resolver o problema ali mesmo
inté[/quote]
aaaah sim
eh j2me
entao esta certo
eh isso mesmo
hehe foi malz
Olá pessoal,
Este trecho me serviu em alguns casos, mas em outros não. Exemplo: serviu no caso 0,009999999 convertendo para 0.01; não serviu quando passei um 0.800000000000007, pois eu queria que convertesse para 0.80 e ele fez para 0.81.
O meu problema é que toda vez que faço uma operação com doubles eles nunca me retornam os valores reais, por exemplo: 140 - 139.99, o resultado deveria ser 0.01, mas o que me retorna é 0.0099999999999.
Estou utlizando a seguinte classe para manipular estes números, se alguém puder analisar e me ajudar a resolver o problema eu agradeço!!!
[code]public class ValorDecimal
{
private double d;
private boolean bIsValid;
public ValorDecimal()
{
bIsValid = true;
}
public ValorDecimal( double d )
{
//recebe um double
bIsValid = true;
double num = d*100;
num = Math.ceil(num);
num/=100;
this.d = num;
}
public ValorDecimal( String s )
{
//Recebe uma String
bIsValid = true;
try
{
this.d = Double.parseDouble(s);
}
catch ( Exception expt )
{
String sAux = new String(s);
String r = new String("");
for ( int a = 0; a < sAux.length(); a++ )
{
if ( "0123456789,".indexOf(sAux.substring(a,a+1)) > -1 )
{
if ( sAux.substring(a,a+1).compareTo(",") != 0 )
{
r += sAux.substring(a,a+1);
}
else
{
if ( r.indexOf(".") == -1 )
{
r += ".";
}
}
}
}
try
{
double num = Double.parseDouble(r);
num = Math.ceil(num);
num/=100;
this.d = num;
//this.d = Double.parseDouble(r);
}
catch ( Exception expt2 )
{
bIsValid = false;
}
}
}
public ValorDecimal( String si, String sd )
{
//Recebe duas strings, uma com a parte inteira e outra a parte decimal
bIsValid = true;
String sitrat = new String("");
for ( int z = 0; z < si.length(); z++ )
{
if ( "-0123456789".indexOf(si.substring(z, z + 1)) > -1 )
{
sitrat += si.substring(z, z + 1);
}
}
try
{
int I = Integer.parseInt(sitrat);
int D = Integer.parseInt(sd);
I *= 100;
I += D;
d = new Integer(I).doubleValue();
d /= 100;
}
catch ( Exception expt )
{
bIsValid = false;
}
}
public String getI()
{
//retorna apenas a parte inteira
double n = d * 100;
Double N = new Double(n);
int i = N.intValue();
String s = new Integer(i).toString();
if ( s.length() > 2 )
{
return s.substring(0, s.length() - 2);
}
else
{
return "0";
}
}
public String getD()
{
//Retorna apenas a parte decimal
double n = d * 100;
Double N = new Double(n);
int i = N.intValue();
String s = new Integer(i).toString();
if ( s.length() > 2 )
{
return s.substring(s.length() - 2, s.length());
}
else if ( s.length() == 1)
{
return "0"+s;
}
else
{
return s;
}
}
public double getValor()
{
//retorna um double formatado
double num = d*100;
num = Math.ceil(num);
num/=100;
return d;
}
public String formatedValue()
{
//Retornar o valor em forma de String formada com o R$
String sI = this.getI();
String sD = this.getD();
String sSimMon = new String("R$");
String sSimSepDec = new String(",");
try
{
ConfiguracaoEN oConfiguracao = new ConfiguracaoDAO().obterObjeto();
if ( oConfiguracao != null )
{
sSimMon = oConfiguracao.getMoeda();
sSimSepDec = oConfiguracao.getSeparadorDecimal();
}
}
catch ( Exception expt )
{
// nada a fazer
}
return sSimMon + " " + sI + sSimSepDec + ( sD.length() == 1 ? "0" : "" ) + sD;
}
public boolean isValid()
{
return bIsValid;
}
}[/code]
Isso é coisa da aritmética de ponto flutuante, agravada pelo fato que o Java, em vez de imprimir apenas 6 casas depois da vírgula (como faz o C e o VB), imprime todas que pode imprimir. Se você usar java.text.DecimalFormat e limitar o número de casas impressas, ou então fazer as contas com java.math.BigDecimal*, então o problema não aparece.
Estão disponíveis em JME? Pq muita coisa que funciona em java não serve em JME.
EDIT - Desconsidere o que postei abaixo, porque não vi que era JavaME.
Dica: este método (public String formatedValue()) pode ser muito simplificado se você souber usar corretamente DecimalFormat.
DecimalFormat é bem mais rápido e correto.
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.util.Locale;
public class ExemploMoeda {
public static void main(String[] args) {
double moeda = 12345.67;
// Fazendo as coisas "no braço"
NumberFormat nf = new DecimalFormat ("R$ #,##0.00", new DecimalFormatSymbols (new Locale ("pt", "BR")));
System.out.println (nf.format(moeda));
// Você também pode usar o formato enlatado do Java, assim:
nf = DecimalFormat.getCurrencyInstance(new Locale ("pt", "BR"));
System.out.println (nf.format(moeda));
// getCurrencyInstance conhece as moedas de vários países. Veja um exemplo:
nf = DecimalFormat.getCurrencyInstance(new Locale ("es", "AR"));
System.out.println (nf.format(moeda)); // Argentina - $12.345,67
nf = DecimalFormat.getCurrencyInstance(new Locale ("es", "ES"));
System.out.println (nf.format(moeda)); // Espanha - 12.345,67 ?
nf = DecimalFormat.getCurrencyInstance(new Locale ("en", "GB"));
System.out.println (nf.format(moeda)); // Inglaterra - £12,345.67
nf = DecimalFormat.getCurrencyInstance(new Locale ("jp", "JP"));
System.out.println (nf.format(moeda)); // Japão - JPY 12,346
nf = DecimalFormat.getCurrencyInstance(new Locale ("cn", "CN"));
System.out.println (nf.format(moeda)); // China - CNY 12,345.67
}
}
O código que você fez infelizmente é grande demais; use DecimalFormat e seja feliz!
Tentei importar o que vc citou no exemplo, mas não encontro este pacote java.text no JME. Estou utilizando Eclipse, preciso baixar algum plugin adicional?
Pois é, como é JavaME, é necessário usar uma solução mais parecida com a sua. Deixe-me ver mais ou menos como seria; só me dê uns instantes.
Tudo bem, eu agradeço!
Fico no aguardo
public class ExemploMoedaJavaME {
// Formatação sem separação de milhares. Exemplo: R$ 12345,67
public static String formatarMoeda (double d) {
if (d >= 0)
return "R$ " +
(long) d +
"," +
("" + (long) (0.5 + 100.0 + 100.0 * (d - Math.floor(d)))).substring(1);
// Note o 0.5 usado aqui para fazer arredondamento.
else {
return "(" + formatarMoeda (-d) + ")";
}
}
public static void main(String[] args) {
double[] moedas = {
0.0,
12.00,
1.2345,
1234.56,
1234.01,
1234.00,
12.34,
12.00,
123457678.99,
123348.81,
-2345.45
};
for (int i = 0; i < moedas.length; ++i) {
System.out.println (formatarMoeda(moedas[i]));
}
}
}
Se você tiver de separar em milhares aí é um pouco mais complicado, mas acho que você deve ter entendido como é meio chato fazer contas.
use floor ao invés de ceil… floor arredonda pra baixo enquanto ceil arredonda pra cima, tb não pra querer q o programa adivinhe tudo que vc quer
mas se vc usa pontos flutuantes apenas pra cáuculo de moeda (dinehiro) onde existirá sempre duas casas decimais, então a dica que eu t dou é usar sempre inteiros, por alguns motivos, um deles é esse perrengue que vc tá passando pra arredondar os valores, outro motivo é q cálculos com pontos flutuantes são mais lentos doq cálculos com inteiros e isso é um peso pra “micro máquina virtual” do aparelho
depois quando for exibir os valores vc acrescenta uma máscara que coloca a virgula depois da segunda casa e um ponto a cada tres casas, sem dúvida isso é mais simples de se implementar e vai reduzir a carga da sua aplicação
flw, t+
Valeu…
Vou tentar fazer diferente!
Obgda pela força
Olá Quikkoo,
De fato encontrei uma dica como a sua (http://developers.sun.com/mobility/midp/questions/float), mas não sei como acrescentar a máscara no J2ME. De qualquer Irisvanda você pode tentar usar bibliotecas de terceiros tais como MicroFloat (http://www.dclausen.net/) ou o MathFP (http://home.comcast.net/~ohommes/jScience/download.html).
Estou com o mesmo problema. Ao tentar fazer uma conta de multiplicação simples:
double subTotal = (qtd * preco); // 2.45 * 9.9
obtenho o resutado: 24.255000000000003
Estou dando uma olhada na documentação que acompanha as bibliotecas.
Olá Miguel,
Acredito que para utilizar ineiros vc teria que converter o resultado para String e adicionar uma vígula antes da penultima substring
Ainda não tentei, mas acredito que vai ajudar
Abraços
Olá Irisvanda,
Perdoe a incipiência dos meus conhecimentos, mas quanto a esta solução (adicionar uma vígula antes da penultima substring), essa tem sido justamente a dificuldade. Agradeceria imensamente se alguém tivesse algum código de susgestão. Até aqui minhas tentativas, estudando a documentação e pesquisando nos forums, ainda não tiveram sucesso.