【问题标题】:DecimalFormat returns wrong resultDecimalFormat 返回错误的结果
【发布时间】:2016-08-18 02:30:30
【问题描述】:

有人知道我在这里做错了什么吗?我有一个浮点数,假设它是 0.04。格式化后变为0.03。显然输出结果已经比输入低 0.01。

这是我的代码:

float creditAvailableProportion = this.accountSummary != null ? (this.accountSummary.getCreditAvailable()/this.accountSummary.getCreditLimit()) : 0;
        DecimalFormat decimalFormat =  new DecimalFormat("#.##");
        decimalFormat.setRoundingMode(RoundingMode.FLOOR);
        float formattedCreditAvailableProportion = Float.parseFloat(decimalFormat.format(creditAvailableProportion));

        return Math.min(1.0f, formattedCreditAvailableProportion);

提前致谢。

【问题讨论】:

  • System.out.println(decimalFormat.format(0.04)); 打印 0.04;你调用它的值小于0.04(将floored0.03)。
  • @Long 你能告诉我们this.accountSummary.getCreditAvailable()this.accountSummary.getCreditLimit() 的值是什么让你期望它们除以0.04 吗?
  • 不要格式化。只需将其四舍五入到小数点后两位即可。你应该没事的。
  • 做一个 System.out.println(creditAvailableProportion)。您应该会发现它小于格式化前的 0.04。
  • 但我需要它采用这种格式。有没有办法获得正确的价值?我试过地板和天花板,但都不对。

标签: java android math decimalformat


【解决方案1】:

由于没有人解释这个问题,让我简要解释一下发生了什么。大多数系统(包括 java)中的浮点数并不准确。这意味着 0.04,内部存储为例如 .03999999999 或 .040000001 或类似的东西。因此,当您使用地板格式对其进行格式化时,您最终可能会得到 0.03。 解决方案是使用舍入格式,或者在格式之前的值中添加 .0000001。这样即使地板也能正确处理。
另一种方法是尽可能完全转储浮点数,并使用整数(如 1e6),类似于 Android 对地理坐标所做的操作。

【讨论】:

    【解决方案2】:

    如何调试:

    运行这段代码,你的问题应该会很清楚:

    float creditAvailableProportion = this.accountSummary != null ? (this.accountSummary.getCreditAvailable()/this.accountSummary.getCreditLimit()) : 0;
    System.out.println(creditAvailableProportion)              //Original value
    DecimalFormat decimalFormat =  new DecimalFormat("#.##");
    decimalFormat.setRoundingMode(RoundingMode.FLOOR);
    String temp = decimalFormat.format(creditAvailableProportion);
    System.out.println(temp);                                      //formatted string
    float formattedCreditAvailableProportion = Float.parseFloat(decimalFormat.format(creditAvailableProportion));
    System.out.println(formattedCreditAvailableProportion);         //Parsed float.
    
    return Math.min(1.0f, formattedCreditAvailableProportion);
    

    希望这会教你钓鱼。

    【讨论】:

    • 我认为是因为这个但不确定为什么:decimalFormat.setRoundingMode(RoundingMode.FLOOR);
    • 那么,哪个值是第一个没有正确数字的值?使用我的代码,您应该会打印出三个值。他们是什么?
    • 请包括所有三个打印输出的输出。
    【解决方案3】:

    另外,你可以试试 Math.floor()。把它变成一个字符串也没用。

    float temp = 7.888888f;
    temp = temp * 100;
            temp = (float) Math.floor((double)temp);
            temp = temp /100;
            System.out.println(temp);
    

    【讨论】:

      猜你喜欢
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 2020-04-28
      相关资源
      最近更新 更多