行星超过数字框

时间:2014-09-13 15:35:16

标签: java numbers number-formatting comma

我遇到以下代码的问题:

    public class Stargazing {
      public static void main(String args[]) {

      double planets = 840000;
      double numofsun = 2.5;
      double total = 0;

      System.out.println("Galaxy #"+"\t"+"Planets");

      for(int i=1;i<12;i++){
        double siSky= planets * numofsun;
        total+=siSky;
        System.out.println(i+"\t"+total);
      }
    }
  }

该计划旨在计算一个特定星系内行星的数量,但问题似乎是一旦行星的数量达到数百万且数十亿它的开始输出这样的数字:

5       1.05E7                                                                                                      
6       1.26E7                                                                                                      
7       1.47E7                                                                                                      
8       1.68E7                                                                                                      
9       1.89E7                                                                                                      
10      2.1E7                                                                                                       
11      2.31E7 

我不知道应该用什么代替双重来实现这一点。

还可以显示逗号,例如:1,200,000,000

我最终会添加更多列,但我必须确保这些列正确,以便其他列中的数字不会显得那么时髦。

1 个答案:

答案 0 :(得分:2)

使用长数字而不是整数,并使用使用分组的DecimalFormat对象。例如,

import java.text.DecimalFormat;

public class Foo {
   private static final String FORMAT_STRING = "0";

   public static void main(String[] args) {
      DecimalFormat myFormat = new DecimalFormat(FORMAT_STRING);
      myFormat.setGroupingSize(3);
      myFormat.setGroupingUsed(true);

      System.out.println(myFormat.format(10000000000000L));
   }
}

这将输出:10,000,000,000,000

编辑,或者如果必须使用双打,则可以始终使用System.out.printf(...),它使用java.util.Formatter的格式化功能。在这里,您可以指定数字输出的宽度,要包括的小数位数以及是否包含组分隔符(带有,标志)。例如:

public static void main(String args[]) {
  double planets = 840000;
  double numofsun = 2.5;
  double total = 0;
  System.out.println("Galaxy #" + "\t" + "Planets");
  for (int i = 1; i < 12; i++) {
     double siSky = planets * numofsun;
     total += siSky;
     System.out.printf("%02d: %,14.2f%n", i, total);
  }
}

返回:

使用printf的关键是使用正确的格式说明符。

  • %02d表示从int值创建数字String,宽度为2个字符,如果需要则为前导0。
  • %,14.2f表示从浮点数(由f表示)创建数字字符串,即14个字符宽,有2个小数位(由.2表示)以及,标志所示的输出分组。
  • %n表示为print或println语句打印一个新行,相当于\n

修改
或者甚至更好,对列标题String和数据行字符串使用类似的格式说明符:

public class Stargazing {
   public static void main(String args[]) {
      double planets = 840000;
      double numofsun = 2.5;
      double total = 0;
      System.out.printf("%8s %13s%n", "Galaxy #", "Planets");
      for (int i = 1; i < 12; i++) {
         double siSky = planets * numofsun;
         total += siSky;
         System.out.printf("%-8s %,13.2f%n", i + ":", total);
      }
   }
}

这将打印出来:

Galaxy #       Planets
1:        2,100,000.00
2:        4,200,000.00
3:        6,300,000.00
4:        8,400,000.00
5:       10,500,000.00
6:       12,600,000.00
7:       14,700,000.00
8:       16,800,000.00
9:       18,900,000.00
10:      21,000,000.00
11:      23,100,000.00