我刚刚开始编程,需要为类做一个作业,我使用序列中的前 8 个术语近似 pi。我需要通过创建一个初始值为 1 的变量"nextTerm"、初始值为 1 的变量"分母"和初始值为 0 的变量"系列"来做到这一点。当我运行它时,我得到了第一个术语,但随后它只显示一行零。老实说,我不知道我在做什么。
public class ApproxPI
{
public static void main(String[] args)
{
int nextTerm = 1;
int denominator = 1;
int series = 0;
for (int denominator = 1; denominator <= 8; denominator++) {
series = ((-1 * ((-1 * nextTerm) / denominator)) * 4);
System.out.println("Pi is approximately" + series);
}
}
}
你为什么不更新nextTerm
永远?它总是等于 1
,一个int
,与你显示的代码。所以你的循环将等效于:
series = ( -1 * (( -1 * 1 ) / denominator )) / 4;
或等效
series = ( -1 * ( -1 / denominator )) / 4;
或
series = ( 1 / denominator ) / 4;
在每次传递时,因为它是int
算法,会丢弃分数:
( 1 / 1 ) / 4 => 1 / 4 => 0
( 1 / 2 ) / 4 => 0 / 4 => 0
( 1 / 3 ) / 4 => 0 / 4 => 0
. . .
( 1 / 8 ) / 4 => 0 / 4 => 0
不要使用int
算术。也不要使用 float
,对变量和文字都使用 double
。您将永远无法仅使用int
值来计算π。
此外,即使您做对了,您的输出也会如下所示:
Pi is approximately3
Pi is approximately1
Pi is approximately4
Pi is approximately1
Pi is approximately5
. . .
这可能不完全是您想要的。
这种算法的手动演练我被教导称为"铅笔测试"。用(虚拟)铅笔和纸精确地遵循逻辑,看看它到底做了什么,而不是你认为它做了什么。
无需声明和初始化denominator
两次。您确实需要修复 nextTerm
的使用。
这是计算 PI 的方法,但你肯定应该初始化你的浮点数和 1.0 而不是 1。e.x
float nextTerm = 1.0;而不是int nextTerm = 1.0。
对每个变量执行此操作以确保功能