2012-01-17 12 views
20

Este programa funciona, excepto cuando el número de nJars es un múltiplo de 7, obtendré una respuesta como $ 14.999999999999998. Para 6, la salida es 14.08. ¿Cómo arreglo las excepciones para múltiplos de 7, por lo que mostrará algo así como $ 14.99?¿Cómo puedo limitar el número de decimales impresos para un doble?

import java.util.Scanner; 
public class Homework_17 
{ 
private static int nJars, nCartons, totalOunces, OuncesTolbs, lbs; 

public static void main(String[] args) 
    { 
    computeShippingCost(); 
    } 

    public static void computeShippingCost() 
    { 
    System.out.print("Enter a number of jars: "); 
    Scanner kboard = new Scanner (System.in); 
    nJars = kboard.nextInt(); 
    int nCartons = (nJars + 11)/12; 
    int totalOunces = (nJars * 21) + (nCartons * 25); 
    int lbs = totalOunces/16; 
    double shippingCost = ((nCartons * 1.44) + (lbs + 1) * 0.96) + 3.0; 

    System.out.print("$" + shippingCost); 
    } 
} 
+7

Como parece que es tarea, solo daré una pista: * Use la clase DecimalFormat. * –

+0

¿Cuál es el problema al usar la clase provista por Java? No es una clase de terceros. –

+1

duplicado de http://stackoverflow.com/questions/8819842/best-way-to-format-a-double-value-to-2-decimal-places –

Respuesta

37

Utilice un DecimalFormatter:

double number = 0.9999999999999; 
DecimalFormat numberFormat = new DecimalFormat("#.00"); 
System.out.println(numberFormat.format(number)); 

le dará "0,99". Puede agregar o restar 0 en el lado derecho para obtener más o menos decimales.

O use '#' a la derecha para hacer que los dígitos adicionales sean opcionales, como con #. ## (0.30) soltaría el 0 final para convertirse en (0.3).

+3

En mi humilde opinión, no use 'Double' cuando quiera usar' double' . –

0

utilizar la clase DecimalFormat para formatear el doble

9

Si desea imprimir/escribir valores dobles en la consola, utilice los métodos System.out.printf() o System.out.format().

System.out.printf("\n$%10.2f",shippingCost); 
System.out.printf("%n$%.2f",shippingCost); 
+1

'" $% .2f "' estará bien, ya que no imprime ningún espacio anterior como en '" $% 10.2f "'.De todos modos +1. –

+1

+1: '% n' puede ser una mejor opción que' \ n' –

0

La clase de formateador es también una buena opción. fmt.format ("%. 2f", variable); 2 aquí le muestra cuántos decimales desea. Puedes cambiarlo a 4 por ejemplo. No te olvides de cerrar el formateador.

private static int nJars, nCartons, totalOunces, OuncesTolbs, lbs; 

public static void main(String[] args) 
    { 
    computeShippingCost(); 
    } 

    public static void computeShippingCost() 
    { 
    System.out.print("Enter a number of jars: "); 
    Scanner kboard = new Scanner (System.in); 
    nJars = kboard.nextInt(); 
    int nCartons = (nJars + 11)/12; 
    int totalOunces = (nJars * 21) + (nCartons * 25); 
    int lbs = totalOunces/16; 


    double shippingCost = ((nCartons * 1.44) + (lbs + 1) * 0.96) + 3.0; 

    Formatter fmt = new Formatter(); 
    fmt.format("%.2f", shippingCost); 

    System.out.print("$" + fmt); 

    fmt.close(); 

} 
0

bien otra solución que pensé sólo por el gusto de hacerlo sería convertir el decimal en una cadena y luego se corta la cadena en 2 cadenas, uno que contiene el punto y los decimales y el otro que contiene el Int a la izquierda del punto. después de eso, limita la Cadena del punto y los decimales a 3 caracteres, uno para el punto decimal y los otros para los decimales. entonces solo recombina.

double shippingCost = ((nCartons * 1.44) + (lbs + 1) * 0.96) + 3.0; 
String ShippingCost = (String) shippingCost; 
String decimalCost = ShippingCost.subString(indexOf('.'),ShippingCost.Length()); 
ShippingCost = ShippingCost.subString(0,indexOf('.')); 
ShippingCost = ShippingCost + decimalCost; 

There! Simple, ¿verdad?

0

No se olvide de:

import java.text.DecimalFormat; 

De lo contrario no será capaz de acceder NumberFormat !!

Cuestiones relacionadas