2012-05-17 61 views
2

我在将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中的,但没有完成循环):

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); 
} 

或者,也许我完全做错了:○。

+1

出于好奇:什么是'while'循环? – Dennis

+0

Java是强类型的,而php不是,并且会为你进行类型转换。如前所述,当你试图用一个整数除数时,java会假定你有一个整数结果,并抛出你的浮点结果,所以你永远不会真正添加任何东西到当前,这会导致你的无限循环。 – gview

回答

2

电流从未超出1,因为1/n = 0时,其中n> 1。

几个要点:

  1. 应该没有必要有while循环或声明我外的用于环
  2. 使用双型
1

使用双号,而不是整数,因为INT师会做有趣的事情。

分数使用INT文字,和INT师必须返回一个int,在你的情况下,往往会返回0,如果我> 1

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

更好地使分子通过改变1到1.0的双字面值:

current = current + (1.0/i); 

现在双师将做你期望师应该做的事情。

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); 
} 

或者,你可以做一个idouble开始。

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

将小数加到1是什么,谢谢! – almondj

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); 
} 
+0

为什么在计算过程中如果只能在最终代码中将'i'变成'double'呢? – Jon

+0

@Jon,真的。虽然没有“在中间投射”,但是在编译时而不是运行时进行投射。 – ilomambo

+0

我的意思是你的代码是在演算过程中与剧组写在一起的。海事组织的清洁工只是把'我'变成'双'。个人喜好。 – Jon

0

INT/INT = INT(如果结果是假设0.07 INT不能持有浮点数这将是0)所以

int/float = float(希望你得到)