使用此代码,从如何编写java第9版(Deitel),练习5.20 ...
从无穷级数计算π的值。 π= 4 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11 + ...... 通过计算本系列的前200,000个术语,打印一个显示π值的表格。在您第一次获得以3.14159开头的值之前,您必须使用多少个术语?
问题是我得到了3.14159的值,这个近似值为0.000005,我认为不是那么好......例如它可能会说130657这个词是第一个但它从3.141585开始......尝试使用0.000001作为精度将不会让我知道该数字从3.14159开始,即使我在输出中看到几个以3.14159开头的数字......
所以,这本书还没有真正解释字符串,除了String.format可能......像@compass这样的解决方案很好但是我宁愿使用数学来解决这个问题,我使用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);
}
}
答案 0 :(得分:1)
请注意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也满足条件(幸运的是,这个精确值不会出现在这个π计算中)
答案 1 :(得分:0)
“在您第一次获得以3.14159开头的值之前,您必须使用多少个术语?”
这些说明不够明确。您必须指定使用哪种舍入算法将值表示为字符串。例如,如果您使用@Compass指定的方法,答案是136120。
但是如果你使用String.format("%.5f", pi)
,那么答案是130657,第一种方法产生pi = 3.141585000020884。
答案 2 :(得分:0)
这非常好用,请记住作者还没有教过如何比较字符串或类似的东西,现在代码工作正常。
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&lt; 0.000005)诀窍),使用Math.abs是个好主意...因为当时,例如pi = 3.141593 ..
然后pi - 3.141595等于-0.000002(当然,并不总是假设数字在那里结束,并且没有更多的小数); Math.abs(-0.000002)= 0.000002&lt; 0.000005 ...并且对于3.14159x中的任何值,其中x = {0 .. 9},值为'Math.abs(pi - 3.141595)&lt; 0.000005'是真的,因此它总是在pi以3.14159开始时识别。