【问题标题】:How do I limit the number of decimals printed for a double?如何限制为双精度打印的小数位数?
【发布时间】:2012-02-12 07:10:27
【问题描述】:

这个程序有效,除非 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);
   }
}

【问题讨论】:

标签: java double int


【解决方案1】:

使用DecimalFormatter

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

会给你“0.99”。您可以在右侧添加或减去 0 以获得更多或更少的小数。

或使用右侧的“#”使附加数字变为可选,如使用 #.## (0.30) 会将尾随的 0 删除为 (0.3)。

【讨论】:

  • 恕我直言,当您打算使用 double 时,请不要使用 Double
【解决方案2】:

如果您想在控制台打印/写入双精度值,请使用 System.out.printf()System.out.format() 方法。

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

【讨论】:

  • "$%.2f" 可以,因为它不会像"$%10.2f" 那样打印任何前面的空格。无论如何+1。
【解决方案3】:

查看 DecimalFormat:http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html

你会做这样的事情:

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

或者,由于您使用的是货币,您可以了解NumberFormat.getCurrencyInstance() 是如何为您工作的。

【讨论】:

    【解决方案4】:

    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();
    
    }
    

    【讨论】:

      【解决方案5】:

      使用 DecimalFormat 类来格式化双精度

      【讨论】:

        【解决方案6】:

        您使用String.format() 方法。

        【讨论】:

          【解决方案7】:

          好吧,我想到的另一种解决方案只是为了好玩,将您的小数转换为字符串,然后将字符串切割成 2 个字符串,一个包含点和小数,另一个包含 Int 到点的左边。之后,您将点和小数的字符串限制为 3 个字符,一个用于小数点,另一个用于小数。然后重新组合。

          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;
          

          那里!很简单吧?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-25
            • 2014-10-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多