Десятичный формат ответа?

Прошу простить мое невежество, я новичок.

Может ли кто-нибудь сказать мне, почему я получаю свой код ошибки в выражении if/else ниже? Я думаю, что мой результат для умножения ln не совсем совпадает со стандартным умножением (есть разница в 0,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);

    }

  }
}

person Joe Austin    schedule 07.02.2013    source источник
comment
вам всегда нужно сравнивать строки, используя equals().   -  person jlordo    schedule 07.02.2013
comment
см. stackoverflow.com/questions/14749647/ например :)   -  person twillouer    schedule 07.02.2013
comment
Вы сравниваете строки с ==. См. tinyurl.com/so-java-string-equality.   -  person Jon Skeet    schedule 07.02.2013


Ответы (4)


Вы сравниваете строковые ссылки, а не их значения, и вам нужно String.equals(), например. z.equals(result)

Однако я думаю, что вы пытаетесь сравнить два десятичных числа с определенной точностью. Более интуитивно понятно вычислить разницу и определить, находится ли она в допустимых пределах ошибки, например.

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

См. Math.abs(double a ) подробнее

person Brian Agnew    schedule 07.02.2013
comment
Я попробовал это и получил ошибку: [строка: 54] double не может быть разыменован - person Joe Austin; 07.02.2013

я бы предложил попробовать

если (!fmt.format(z).equals(fmt.format(результат)) {

person marty    schedule 07.02.2013

  1. Используйте BigDecimal вместо double
  2. Используйте StrictMath вместо Math
person Aaron Kurtzhals    schedule 07.02.2013

Думаю, это из-за двойки. Вместо этого лучше использовать BigDecimal. Пожалуйста, взгляните на "Почему я вижу двойную переменную, инициализированную некоторым значением, например 21,4, как 21.399999618530273?".

person Igor K    schedule 07.02.2013
comment
Вы имеете в виду BigDecimal вместо BigInteger? - person Aaron Kurtzhals; 07.02.2013
comment
Конечно, BigDecimal. Спасибо за исправление. - person Igor K; 07.02.2013