1

初心者ですので無知をお許しください。

以下の if/else ステートメントでエラー コードが表示される理由を誰か教えてもらえますか? ln 乗算の結果は、標準の乗算とまったく同じではないと思います (違いの .00000000006 などがあります)。これに対する回避策はありますか?DecimalFormat を使用しようとしましたが、役に立ちませんでした。

私が追加した場合:

DecimalFormat fmt = new DecimalFormat ("0.###");

テスターに

    if (fmt.format(z) != fmt.format(result)){

if ステートメントに対して、私は自分の同じエラーステートメントを受け取ります。なにが問題ですか!?

どうもありがとうございました。

ジョー

import java.util.Scanner; 
import java.lang.Math;
import java.text.DecimalFormat;


public class Logs {

  //integer x field & encapsulation
  private static double x;

  // x encapsulation
  public double getX(){
    return x;
  }
  public void setX (double ex){
    if (ex >= 0){
      x = ex;
    }
    else{
    System.out.println("You may not choose a negative number, 'x' = 0");
    }
  }

  //integer y field 
  private static double y;
  // y encapsulation
  public double getY(){
    return y;
  }

  public void setY (double why){
    if (why >= 0){
      y = why;
    }
    else{
    System.out.println("You may not choose a negative number, 'y' = 0");
    }
  }

  //tester
  public static void main (String [] args){
    Logs sample =new Logs();
    Scanner var = new Scanner(System.in);
    DecimalFormat fmt = new DecimalFormat ("0.###");
    sample.setX (var.nextDouble());
    sample.setY (var.nextDouble());

    x = sample.getX();
    y = sample.getY();
    double z = (x*y);
    double logX = Math.log(y);
    double logY = Math.log(x); 
    double logZ = (logX +logY); 
    double result = (Math.exp(logZ));



    if (z != result){
      System.out.printf("%s", "Incorrect answer: be a better coder");
    }
    else {
      System.out.printf("%s %.3d %s %.3d %s %.3d", 
                        "The product of the values you chose is: ", + z,
                        "\nln(x) + ln(y) is: ", + logZ,
                        "\nCompute to e: ", + result);

    }

  }
}
4

4 に答える 4

1

ではなく文字列参照を比較していて、たとえば必要ですString.equals()z.equals(result)

ただし、あなたがやろうとしているのは、2 つの 10 進数を特定の精度と比較することだと思います。差を計算し、それが許容誤差範囲内にあるかどうかを判断する方が直感的です。

if (Math.abs(z - result) < 0.01) {
   // ok
}

詳細については、Math.abs(double a)を参照してください。

于 2013-02-07T17:26:01.193 に答える
0
  1. double の代わりに BigDecimal を使用する
  2. Math の代わりに StrictMath を使用する
于 2013-02-07T17:32:17.377 に答える
0

試してみることをお勧めします

if (!fmt.format(z).equals(fmt.format(result))) {

于 2013-02-07T17:26:23.563 に答える
0

ダブルだからだと思います。ベスト プラクティスとして、代わりに BigDecimal を使用してください。「21.399999618530273 のように 21.4 のような値に初期化された double 変数が表示されるのはなぜですか?」をご覧ください。

于 2013-02-07T17:26:38.813 に答える