java: Precision in double numbers



我一直在处理这段代码,从如何在java第九版(Deitel)中编程,练习5.20…

从无穷级数中计算π的值。π=4–4/3+4/5–4/7+4/9–4/11+…打印一个表格,显示通过计算该系列的前200000项来近似的π值。在第一次获得以3.14159开头的值之前,您必须使用多少术语?

问题是,我得到了3.14159的值,这个近似值是0.000005,我认为这不是很好。。。例如,它可能会说130657是第一个,但它以3.141585开始……试图使用0.000001作为精度永远不会让我知道这个数字以3.14159开始,尽管我在输出中看到了几个以3.14159开头的数字…

所以,这本书还没有真正解释字符串,除了String.format可能。。。像@componess这样的解决方案很好,但我更喜欢用数学来解决这个问题,我使用Math.abs(),因为我认为使用会有所帮助

if ( 3.14159 <= pi && pi < 3.14159 )

没有帮助,

这个问题还没有解决,有没有一种方法可以通过数学运算符准确地知道变量pi何时从3.14159开始?

import javax.swing.JOptionPane;
public class Pi {
public static void main (String args[]){
double pi = 4;
double fraccion = 3.0;
double cociente ;
for ( int i = 1 ; i <= 200000 ; i++ ){          
cociente = 4.0/fraccion;
if ( i % 2 == 0 )
pi += cociente;
else
pi -= cociente;
System.out.printf("El valor de pi en el término %d, es : %.6f n", i , pi);
if ( Math.abs( pi - 3.14159 ) <= 0.000005)
JOptionPane.showMessageDialog(null, String.format("Pi vale: %.5f este es el primer valor que empieza con 3.14159 en el término %d", pi, i));
fraccion += 2.0;
}
System.exit(0);
}
}

注意,Math.abs(-0.1) = 0.1——绝对值丢弃负号。这意味着Math.abs(3.141585 - 3.14159) == Math.abs(-0.000005) == 0.000005满足条件。

要检查数字是否以3.14159开头,只需将其与区间进行比较:

if (3.14159 <= pi && pi < 3.14160)

如果必须使用abs,则应检查

if (Math.abs(pi - 3.141595) <= 0.000005)
//                       ^

但这是错误的,因为3.14160也满足条件(尽管幸运的是,这个确切的值不会出现在这个π计算中)

"在第一次获得以3.14159开头的值之前,您必须使用多少项?">

这些说明不够清楚。您必须指定要使用哪种舍入算法来将值表示为字符串。例如,如果使用@Compass指定的方法,则答案为136120。

但是,如果使用String.format("%.5f", pi),那么答案是130657,其中第一种方法产生pi=3.1415850000020884。

这非常有效,记住作者还没有教过如何比较字符串或类似的东西,代码现在可以正常工作了。

import javax.swing.JOptionPane;
public class Pi {
public static void main (String args[]){
double pi = 4;
double fraccion = 3.0;
double cociente ;
int firstSixDigits;
for ( int i = 1 ; i <= 200000 ; i++ ){          
cociente = 4.0/fraccion;
if ( i % 2 == 0 )
pi += cociente;
else
pi -= cociente;
System.out.printf("El valor de pi en el término %d, es : %.10f n", i , pi);
firstSixDigits = (int) ( pi * 100000.0 ) ;

if ( firstSixDigits % 314159 == 0  )
JOptionPane.showMessageDialog(null, String.format("Pi vale: %.10f este es el primer valor que empieza con 3.14159 en el término %d", pi, i));
fraccion += 2.0;
}
System.exit(0);
}
}

此外,为了结束这一切。。。

事实上,唯一需要纠正的是我使用的参数(pi-3.141595<0.000005),使用Math.abs是个好主意。。。因为,例如,当pi=3.141593…

那么π-3.141595等于-0.000002(当然,并不总是这样,让我们假设数字就在那里结束,不再有小数);Math.abs(-0.000002)=0.000002是<0.000005…并且对于3.14159x中的任何值,其中x={0..9};0.000005'是真的,所以它总是能识别π何时以3.14159开头。

最新更新