谐波系列

时间:2012-05-17 03:51:48

标签: java php

我遇到了将PHP脚本转移到Java的问题。我正在使用谐波系列。我有它在PHP中工作,但当我将它转换为Java时,它永远不会结束(无限循环)。有任何想法吗?或者甚至是更好的方法来完成它?

PHP:

<?php

$current = 0;
$num = 2.5;

while($current < $num) {
    for($i = 1; $current < $num; $i++) {
        $current = $current + (1 / $i);
    }

    // this ($current) will return "2.5928571428571" (which it should)
    echo $current;
}

?>

Java(相当于Java,但没有完成循环):

double current = 0;
double num = 2.5;
int i = 0;

while(current < num) {
    for(i = 1; current < num; i++) {
        current = current + (1 / i);
    }

    System.out.println(current);
}

或许我完全做错了:o。

5 个答案:

答案 0 :(得分:2)

电流永远不会超过1,因为1 / n = 0,其中n> 1。

几点:

  1. 不需要使用while循环或在for循环之外声明我
  2. 使用双重类型

答案 1 :(得分:1)

使用双数,而不是整数,因为int division会做有趣的事情。

分数使用int文字,而int division 必须返回一个int,在你的情况下,如果i&gt;它通常会返回0。 1

即,

current = current + (1 / i); // will return current + 0 if i > 1

最好通过将1更改为1.0来使分子成为双字面值:

current = current + (1.0 / i);

现在双师将按照你的期望做分。

答案 2 :(得分:0)

问题在于类型转换。在这种情况下,PHP并不关心类型,因此它可以在那里工作。

另一方面,在Java中,您需要强制部门中的double类型才能实现此目的。

double current = 0;
double num = 2.5;
int i = 0;

while(current < num) {
    for(i = 1; current < num; i++) {
        current += (1.0 / i); // Force the result to be a decimal with 1.0
    }
System.out.println(current);
}

或者,您可以i double开始。

...
for(double i = 1.0; current < num; i+=1.0)
  current += 1.0/i;

答案 3 :(得分:0)

创建一个中间变量,以查看总和是否是问题并且能够进行调试。

double current = 0;
double num = 2.5;
double inc;

while(current < num) {
    for(int i = 1; current < num; i++) {
        inc = 1 / (double)i;
        current += inc;
    }
System.out.println(current);
}

如果它解决了您的问题,最终的代码可以是

double current = 0;
double num = 2.5;

while(current < num) {
    for(int i = 1; current < num; i++) {
        current += (1 / (double)i);
    }
System.out.println(current);
}

答案 4 :(得分:0)

int / int = int(如果结果是假设.07 int不能保存浮点数它将为0)所以

int / float = float(希望你有)

相关问题