0

我的范围从最小值到最大值。我想通过计算这些值中的每一个来生成一组信息。我想通过打印输出这些信息。

给定一个循环一次只能输出 1 个范围值的信息,如何生成此输出?

编程经验——绝对的初学者。

代码如下: 基本上,如果用户输入 1,我会输出 min2 的所有值的信息。否则,我只输出 min2 的集合及其 probB 为 1/2 的信息。另外,我可以只使用 min1(来自用户输入)而不将其分配给 min2 吗?

int prompt = Integer.parseInt(input);   // user input
int min2 = 0;
double probB = 0;
for (min2 = min1; min2 < max1; min2++) // for loop
{
  if (prompt==1){
    int R = 0;
    double Rlow = 0;
    double Rhigh = 0;
    R = (int) (Math.sqrt(2) + 1)*min2;
    Rlow = (Math.sqrt(2)+1)*min2+ 1;
    Rhigh = (Math.sqrt(2)+1)*min2;
    System.out.println(min2);
    System.out.print(""+Rlow+""+Rhigh);
    System.out.println(R);
    probB = (R/R+min2)*(R-1/R+min2-1);
    System.out.println(probB);
  }
  else {
    int R = 0;
    double Rlow = 0;
    double Rhigh = 0;
    R = (int) (Math.sqrt(2) + 1)*min2;
    Rlow = (Math.sqrt(2)+1)*min2+ 1;
    Rhigh = (Math.sqrt(2)+1)*min2;
    probB = (R/R+min2)*(R-1/R+min2-1);

    if (probB == 1/2){
      System.out.println(min2);
      System.out.println(""+Rlow+""+Rhigh);
      System.out.println(R);
      System.out.println(probB);
    }
  }
}
4

1 回答 1

3

代替

    if (probB == 1/2){

利用

    if (probB == 1.0d/2.0d){

表达式1/2计算为整数,其值为零。更好的是:

    if (probB == 0.5d){

但是请注意,如果在计算probB结果时有任何舍入,即使您期望它最终也可能不会恰好是 0.5。您可以构造最终结果“应该”为 0.5 但实际结果非常接近但不完全是0.5 的表达式,因为浮点表示不准确。您最好的选择是执行以下操作:

    if (Math.abs(probB-0.5d) <1.0e-10d)

即接近 10^10 的一部分

浮点计算非常有用,但由于它们不是精确的表示,它们带有一些陷阱。在十进制中,有一整套有理数不能精确表达,比如1/3、1/7等。可以通过扩展位数(0.33333333...或0.142857142857142...)任意接近但你不能用十进制写出精确的表示。同样的事情发生在浮点数中(对于一组不同的数字),但是 FP 有一个固定的长度,所以像 0.1 这样的数字不能在 FP 中精确地表示。它很接近,但不准确。您必须始终在比较中考虑到这种可能性。

于 2012-09-13T01:33:18.397 回答