studio que programa numeros numberformat monedas moneda formato desglose calcular billetes java currency rounding

que - ¿Cómo recojo los valores de moneda en Java?



numberformat java (10)

De acuerdo, aquí está mi problema. Básicamente tengo este problema.

Tengo un número como .53999999. ¿Cómo lo redondeo a 54 sin usar ninguna de las funciones matemáticas?

Supongo que tengo que multiplicar por 100 para escalarlo y luego dividirlo. ¿Algo como eso?

El problema es con dinero. digamos que tengo $ 50.5399999. Sé cómo obtener los $ 50, pero no tengo cómo obtener los centavos. Puedo obtener la parte de .539999, pero no sé cómo obtenerla a 54 centavos.



¿Qué estás tratando de hacer exactamente? ¿Siempre intentas ir a dos dígitos? ¿O siempre intentas arreglar cosas como 99999 al final sin importar qué?

Según los comentarios, de hecho es el primero: redondeando a dólares y centavos. Entonces, de hecho, solo la round(100*a)/100 es lo que quieres. (Esto último sería mucho más complicado ...)

Finalmente, si solo quieres extraer la parte de centavos, lo siguiente funcionaría:

dollars_and_cents = round(100*a)/100 cents = (dollars_and_cents-(int)dollars_and_cents)*100

(¿o solo tiene java?) En este caso, la última línea sería frac(dollars_and_cents)*100 .


Debe hacer el número .535 y compararlo con su número original para ver si redondea hacia arriba o hacia abajo. Así es como obtienes .535 de .53999999 (debería funcionar para cualquier número):

num = .53999999; int_num = (int)(num * 100); // cast to integer, however you do it in Java compare_num = (int_num + 0.5) / 100;

compare_num sería .535 en este caso. Si num es mayor o igual que compare_num , redondee a int_num + 1 . De lo contrario, redondee simplemente a int_num .


Debe usar un tipo decimal o de moneda para representar dinero, no coma flotante.


Parece que Sean lo tiene, excepto que, si quiere imponer reglas adecuadas, entonces puede incluir una declaración if como esta:

double value = .539999; int result = (int) (value*100); if(((value*100)%result)>.5) result++;


Te sugiero que uses mucho para redondear un doble valor. No importará para números pequeños, pero podría marcar la diferencia.

double d = 50.539999; long cents = (long)(d * 100 + 0.5); double rounded = cents/100;


Las matemáticas con dinero son más complejas de lo que la mayoría de los ingenieros piensan (por sobre generalización)

Si está haciendo cálculos de divisas, creo que puede estar investigando problemas que parecen simples en su superficie pero que en realidad son bastante complejos. Por ejemplo, los métodos de redondeo que son el resultado de decisiones de lógica de negocios que se repiten a menudo pueden afectar drásticamente los totales de los cálculos.

Si esto es tarea, mostrarle al docente que ha pensado en el problema del mundo real en lugar de simplemente colgar un montón de código que "funciona" seguramente será más impresionante.

En una nota al margen, inicialmente iba a sugerir mirar la implementación de los métodos matemáticos de Java en el código fuente, así que eché un vistazo. Noté que Java estaba usando métodos nativos para sus métodos de redondeo, justo como debería.

Sin embargo, un vistazo a BigDecimal muestra que hay una fuente de Java disponible para redondear en Java. Entonces, en lugar de solo darte el código de tu tarea, te sugiero que consultes el método privado BigDecimal doRound (MathContext mc) en la fuente Java.


Trate de almacenar su moneda como el número de centavos (puede abstraer esto a la cantidad de unidades curreny base) con un largo.

Editar: dado que esto es tarea, es posible que no tenga control sobre los tipos. Considere esto como una lección para proyectos futuros

long money = 5054; long cents = money % 100; long dollars = money / 100; // this works due to integer/long truncation System.out.printf("$%d.%02.d", dollars, cents);


Yo usaría algo como:

BigDecimal result = new BigDecimal("50.5399999").setScale(2, BigDecimal.ROUND_HALF_UP);

Hay un excelente artículo llamado Make centats con BigDecimal en JavaWorld que deberías echarle un vistazo.


Si 50.54 no es representable con doble precisión, el redondeo no ayudará.

Si está tratando de convertir 50.53999999 a un número entero de dólares y un número entero de centavos , haga lo siguiente:

double d = 50.539999; // or however many 9''s, it doesn''t matter int dollars = (int)d; double frac = d - dollars; int cents = (int)((frac * 100) + 0.5);

Tenga en cuenta que la adición de 0.5 en ese último paso es redondear al número entero más cercano de centavos. Si siempre quiere que se redondee, cámbielo para agregar 0.9999999 en lugar de 0.5.