【问题标题】:Setting the Decimal to format ##.## in java在java中将十进制设置为格式##.##
【发布时间】:2010-11-24 05:59:44
【问题描述】:

我正在尝试构建一个地图,时间从 06.00 到 23:59 作为键,我将跟踪每个时间的数字作为值。我需要时间将 HH.mm 存储为格式,我正在计划通过增加一分钟来使用循环构建地图并在循环内运行以下代码。这里的问题是因为我必须严格将格式设置为 HH.MM 我必须将输入作为字符串并将其格式化然后解析它返回为影响性能的双倍。是否有一个全局设置要更改,以便我在这个特定类中选择的任何双倍数都应该是格式##.##。这里还要注意的是,因为它是时候结束了在 60 分钟,因此我必须在 .6 的帮助下中断当前迭代。

    Map map = new LinkedHashMap();
    //Edit:Moved DecimalFormat Outside the loop
    DecimalFormat df = new DecimalFormat("##.##");
    for (double time= 06.00; time<= 22.00; time= time+ 01.00)
    {

        String timeString = df.format(appointmentTime);
        time = Double.parseDouble(timeString);

        if (timeString.indexOf(".6") != -1)
        {
            time= time+ 00.40;

        }
        map.put(time,"<number>");
    }

【问题讨论】:

  • 我认为您采取了错误的方法。您到底想解决什么问题?
  • 我正在尝试为特定 java 类中的所有双精度值保持通用格式##.##。格式化单个元素会影响性能。硬编码会影响可读性及其流畅的 Map,可能会有步长值从 1 分钟到 30,所以我也无法对其进行硬编码。
  • 如果您能够将您的示例程序修改为可以编译、运行和打印出一些有意义的值和消息的示例程序,我认为这对我们来说会更容易理解,从而可以提供帮助。

标签: java format decimal


【解决方案1】:

我相信你选择了最复杂的方法。您可以迭代一个简单的数字来表示从 0 点开始的分钟数,而不是迭代时间变量,然后仅为地图生成双倍时间。

for(int totalMinutes = 6 * 60; totalMinutes <= 22 * 60; totalMinutes ++) {
    map.put(buildTimeDouble(totalMinutes),”<number>”);
}

但我相信(我当时不明白你的问题),最好不要使用双精度作为映射键,而是可以使用自己的 Time 类,例如:

Time{
  private  int hour;
  private int minutes;

  public Time(int hour; int minutes) {
     this.hour = hour;
      this.minutes = minutes;
   }

   public toString(){
      return hour + “:” + minutes
   }

   public static Time fromTotalMinutes(int totalMinutesSinceZeroOclock){
      return new Time(totalMinutesSinceZeroOclock / 60; totalMinutesSinceZeroOclock / 60);
   }
}

【讨论】:

    【解决方案2】:

    如果您担心性能,您应该对代码进行的一项修改是在循环之外仅构造一次DecimalFormat。同一个实例可以在循环内一遍又一遍地重复使用。

    【讨论】:

    • 实际上这是一个示例代码,在我的实际代码中它在循环之外,但我的要求是我根本不应该这样做。输入是未格式化的小数,我将其转换为字符串和返回解析后的小数
    【解决方案3】:

    对所有这些值进行预计算不是一个好方法。也许您可以使用LRU cache。这可以使用LinkedHashMap轻松实现。我还认为您不应该使用双精度来表示时间.通过这个article,它可能会给你一些新的想法。

    【讨论】:

      【解决方案4】:

      您不应该将双精度数用作计数器,因为舍入误差会蔓延到一倍误差。

      取而代之的是一个整数计数器,您可以从中计算所需的时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-15
        • 1970-01-01
        • 2012-09-30
        • 1970-01-01
        相关资源
        最近更新 更多