Как ограничить количество десятичных знаков, напечатанных для двойного? - PullRequest
22 голосов
/ 17 января 2012

Эта программа работает, за исключением случаев, когда число nJars кратно 7, я получу ответ, например, $ 14.999999999999998.Для 6 выход 14.08.Как исправить исключения для кратных 7, чтобы они отображали что-то вроде $ 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);
   }
}

Ответы [ 7 ]

41 голосов
/ 17 января 2012

Используйте Десятичныйформат :

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

Даст вам "0,99".Вы можете добавить или вычесть 0 с правой стороны, чтобы получить больше или меньше десятичных знаков.

Или используйте «#» справа, чтобы сделать дополнительные цифры необязательными, как в случае с #. ## (0.30) приведет к падению конечного 0, чтобы стать (0.3).

9 голосов
/ 17 января 2012

Если вы хотите напечатать / записать двойное значение на консоли, используйте методы System.out.printf() или System.out.format().

System.out.printf("\n$%10.2f",shippingCost);
System.out.printf("%n$%.2f",shippingCost);
5 голосов
/ 17 января 2012

Проверьте DecimalFormat: http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html

Вы сделаете что-то вроде:

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

Или, так как вы работаете с валютой, вы можете увидеть, как работает NumberFormat.getCurrencyInstance() длявы.

0 голосов
/ 09 ноября 2016

хорошо, еще одно решение, о котором я подумал просто для удовольствия, состоит в том, чтобы превратить десятичную дробь в строку, а затем разрезать строку на 2 строки, одна из которых содержит точку и десятичные дроби, а другая содержит Int дляслева от точки.после этого вы ограничиваете строку точки и десятичных дробей тремя символами, один для десятичной точки и другие для десятичных.тогда просто рекомбинируйте.

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;

Там!Просто, правда?

0 голосов
/ 10 сентября 2016

Класс Formatter также является хорошим вариантом. fmt.format ("%. 2f", переменная); 2 здесь показывает, сколько десятичных знаков вы хотите. Вы можете изменить его на 4, например. Не забудьте закрыть форматер.

 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 голосов
/ 17 января 2012

Вы используете метод String.format () .

0 голосов
/ 17 января 2012

Используйте класс DecimalFormat для форматирования двойного

...