web-dev-qa-db-fra.com

Comment limiter le nombre de décimales imprimées pour un double?

Ce programme fonctionne, sauf lorsque le nombre de nJars est un multiple de 7, j'obtiendrai une réponse du type 14,99999999999999998 $. Pour 6, la sortie est 14.08. Comment puis-je corriger les exceptions pour des multiples de 7 afin d'afficher quelque chose comme 14,99 $?

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);
   }
}
21
cutrightjm

Utilisez un DecimalFormatter :

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

Vous donnera "0,99". Vous pouvez ajouter ou soustraire 0 sur le côté droit pour obtenir plus ou moins de nombres décimaux. 

Ou utilisez '#' à droite pour rendre les chiffres supplémentaires facultatifs, comme dans # # # (0.30) laisserait tomber le dernier 0 pour devenir (0.3).

40
Alex

Si vous voulez imprimer/écrire une double valeur sur la console, utilisez les méthodes System.out.printf() ou System.out.format().

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

Découvrez DecimalFormat: http://docs.Oracle.com/javase/6/docs/api/Java/text/DecimalFormat.html

Vous ferez quelque chose comme:

new DecimalFormat("$#.00").format(shippingCost);

Ou puisque vous travaillez avec de la monnaie, vous pouvez voir comment NumberFormat.getCurrencyInstance() fonctionne pour vous.

5
Jeremiah Orr

La classe de formatage est également une bonne option. fmt.format ("%. 2f", variable); 2 indique le nombre de décimales souhaité. Vous pouvez le changer à 4 par exemple. N'oubliez pas de fermer le formateur.

 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
Tahir Ferli

Utilisez la classe DecimalFormat pour formater le double

0
Jrom

Vous utilisez la méthode String.format () .

0
Wernsey

ok une autre solution que je pensais juste pour le plaisir serait de transformer votre virgule décimale en chaîne, puis coupez la chaîne en 2 chaînes, l'une contenant le point et les décimales et l'autre contenant l'Int situé à gauche du point. après cela, vous limitez la chaîne du point et les décimales à 3 caractères, un pour la virgule décimale et les autres pour les décimales. alors juste recombiner.

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;

Là! Simple, non?

0
SonEasterZombie