java中 求pi时 为啥输出的是4.0啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中 求pi时 为啥输出的是4.0啊?相关的知识,希望对你有一定的参考价值。

题目是:用pi/4=1-1/3+1/5-...公式求pi的近似值;直到某一项的绝对值小于10的-6次方
代码是
class nihao

public static void main(String args [])

double pi=0;
int i =1;
for (i=1;Math.abs(1/i)>1E-6;i+=2)

if(i%4==1)

pi+=(1/i);

else

pi-=(1/i);


pi=pi*4;
System.out.println (pi);


为什么输出来的就是4.0呀?能告诉我哪写错了吗?嘻嘻 很新很新的新手 能讲解的通俗一点吗?谢谢。。

因为在计算的时候数据类型默认转换失败。
参考以下程序:
public class CaculatePi
/**
* @param args
*/
public static void main(String[] args)
getPi(10000);
getPi(20000);

//输入迭代次数
public static void getPi(int n)
float pi = 0;
for(int i = 1;i<=n;i++)
if(i%2==1)
pi = pi + (float)1/(2*i-1);
else
pi = pi - (float)1/(2*i-1);


System.out.println("n="+n+";π="+4*pi);

参考技术A 因为在计算的时候数据类型默认转换失败。
参考以下程序:
public
class
CaculatePi

/**
*
@param
args
*/
public
static
void
main(String[]
args)

getPi(10000);
getPi(20000);

//输入迭代次数
public
static
void
getPi(int
n)

float
pi
=
0;
for(int
i
=
1;i<=n;i++)

if(i%2==1)

pi
=
pi
+
(float)1/(2*i-1);
else

pi
=
pi
-
(float)1/(2*i-1);


System.out.println("n="+n+";π="+4*pi);

参考技术B public class Test

public static void main(String[] args)
double pi = 0;
int i = 1;
for (i = 1; Math.abs(1.0d / i) > 1E-6; i += 2)
if (i % 4 == 1)
pi += (1.0d / i);
else
pi -= (1.0d/ i);


pi = pi * 4;
System.out.println(pi);



这样就行了,你直接用1/i是不行的,默认1和i都是int型,当i>1时1/i结果是0,改为1.0d/i就是double型了本回答被提问者采纳
参考技术C 给你正确的代码。自己看看吧。
public
class
max

public
int
t(int
a,
int
b,
int
c)

int
max
=
a;
if
(b
>
max)

max
=
b;

else
if
(c
>
max)

max
=
c;

return
max;

public
static
void
main(string[]
args)

max
t
=
new
max();
system.out.println(t.t(5,
3,
1));

C语言中学指针时*和&是相互补充的,为啥啊?

搞不懂,求详细解释
就是说&*ptr和*&是等价的 为什么啊

参考技术A 举个例子吧 int i 和 int *p 定义一个变量 i 和 一个指针p
p=&i; 意思就是p 指向 i 因为指针是一段4字节大小的空间,里面存放着指向的目标的地址 &的意思就是取地址 也就是取i的地址存放到p里
在定义一个 int j
j=*p 意思就是 j=i *p的意思是p 解引用的意思就是引用指针指向的内容 这里也就是i
这么说明白么?
参考技术B 再地址运算中,有
*+地址==取地址的对象
&+对象==去对象的地址

这个编译器就是这么定义的,你想问题为什么一定是这两个符号吗?如果是这个我问题,我个人认为就跟英文a表示一个一样,为什么不用b呢?不过我倒是觉得@更合适替换*
参考技术C 1. 在C语言中,所有的类型都是值类型,传参也都是值传递。不要听谭浩强书上说分什么引用类型和值类型,所有的类型都有其值!

2. 指针类型也是一个值,这个值表示一个内存地址,是一个int型数据。

3. * 和 & 都是操作符。记住,他们是操作符,操作符的定义是什么?
* 表示间接引用,& 表示取址。

假设有一个变量:
int num = 4;
获取num在内存中的地址:
&num,结果是一个16进制的int数据

可以使用指针保存这个数据,如下
int *p = #

可以使用这个指针获取该内存地址存储的值
int b = *p;

这样,两个操作符之间的互相转换的关系,明白了么?就相当于乘法和除法的互相转换!

至于他们互相补充,我想应该是值内存中地址的加减法运算!
【例子】获取下一块内存地址的值
*(p+1) <=> *( &num + 1 * sizeof(int) ) 很明显使用指针写的代码少多了,方便多了!注意,此处获得的地址可能是非法的,但是可以此处忽略,不是我们讨论的重点!追问

是我没把问题说清楚 我用的是清华大学出版社的C how to program
课本中对指针讲得很不详细
这样一段程序
int a=1;
int *aPrt=&a;
printf("%p\n%p",&*aPrt,*&aPrt)
书上说输出的两行结果是一样的都是aPrt的值即a的地址 我就看不懂了 假设定义aPrt时它被分配给了3000H这个位置,a被分配给了2000H这个位置 那么*&aPrt=*(&aPrt)=*(3000H)=2000H=aPrt 可是&*aPrt=&(1),1是一个数字&如何对其操作呢?

追答

额。。。
&*aPrt = &(*aPrt) = &(a)而不是&(1)! &(a)和&(1)是两回事。这里不是简单的公式替换,你此处的1是哪来的,就是存储a的那块内存取得的,这个1是有地址的。。。。

对比下:#define a 1 此处的1是常量
此时,你再试试cout<<&a<<endl; 看看值是多少

等我周一直接给你解释上面程序的汇编代码吧~~~感觉自己没有描述到点子上,你还会有疑惑的!

本回答被提问者采纳
参考技术D 因为定义了指针变量*p后,p后就代表所指变量的地址,要把变量的地址赋值给p 就要用到&符号
定义了这许多之后,*p代表的就是地址的内容

以上是关于java中 求pi时 为啥输出的是4.0啊?的主要内容,如果未能解决你的问题,请参考以下文章

java中"(double)(Math.round(x3 * 10000))/10000"为啥这个东西会输出小数啊?

C语言,求高手分析双精度的输入,为啥定义一个双精度,输入函数中少了一个l,只用%f,可以执行,结果错误

为啥进不了for循环,得到的结果总是0? 求大神指教啊!!

java编程语言谁会,下面题目帮解答一下,要详细步骤啊…………谢谢 急急急求……

java中为啥有的直接打印对象输出的是哈希值,打印date对象输出的是时间

新人求问,sublime控制台输入后为啥没有输出