【问题标题】:For Loop for Decimal values十进制值的循环
【发布时间】:2021-11-03 12:46:12
【问题描述】:

我得到两个值,例如 a=2.7(可以是十进制的任何值,例如 2.007 & ..) b=3.5(可以是任何十进制数,例如 3.007 & ..)

我想提取 2.7 到 3.5 之间的所有值,即 2.7, 2.8, 2.9 ........ 3.5

我尝试过的是

for (double i = lower; i <= upper; i=i+0.1) {
    Storing i value;
            }

lower 是小数的开始,upper 是小数的结束

如何使用 for 循环或任何其他方法实现此目的? 注意:该值也可以是 2.7 或 2.00007

【问题讨论】:

  • 工作正常,有什么问题? ideone.com/wAatBQ
  • 值得注意的是,使用 boxed Double 会导致大量的装箱和拆箱。只需使用原语double
  • @Michael 对不起,拼写错误,我使用的是 double 但是如果值是 lower = 3.789 和 upper = 4.983 怎么办?
  • @akshaykale,阅读此内容以获取帮助stackoverflow.com/questions/26120311/…

标签: java loops for-loop iterator iteration


【解决方案1】:

从表面上看,您的版本看起来应该可以工作。但是,我怀疑您遇到了所有使用 floatdouble 的计算所固有的问题:浮点类型不精确1

见:Is floating point math broken?

(答案是:不……但它并不像你想象的那样起作用。)

不管怎样,用这样的代码:

for (double i = lower; i <= upper; i = i + 0.1) {
    System.out.println(i);
}

您可能会发现打印的值并不完全符合您的预期。实际上,可能不会打印最后一个值(upper 或附近)。根本原因是浮点不精确(如上述问答中所述)。

如果您希望精确 值一直被打印出来,您将需要使用BigDecimal 来表示数字并执行算术运算。


1 - 这不是 Java 特定的问题。任何使用 base-2 浮点数表示的编程语言都会看到相同的效果。大多数现代计算机在硬件中都支持符合 IEEE 754 的浮点算术,并且大多数语言都利用这一点作为它们的浮点类型。

【讨论】:

    【解决方案2】:

    尝试四舍五入,因为最多小数点后一位,这对你有用。

    for (double i = lower; i <= upper; i += 0.1) 
            System.out.printf("%.1f\n",i); 
    

    您可以在不四舍五入的情况下找到有关该问题的更多信息Why does adding 0.1 multiple times remain lossless?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 2018-08-07
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      相关资源
      最近更新 更多