Werte mit Prozentualer Toleranz vergleichen

feuer1978

Mitglied
Hallo,

bin noch ein totaler Anfänger, weshalb ich mich in dem Gebiet nicht auskenne.

Ich möchte zwei Werte mit einer Prozentualen Abweichung von vielleicht 15% vergleichen.

Bisher werden die Werte exakt verglichen, aber nun soll immer die erste Funktion (z.B. this.normalfunktion1()) mit der zweiten Funktion (z.B this.normalfunktion2()) übereinstimmen, falls die zweite Funktion eine abweichung von +15% und -15% hat. Wie mache ich das?

Java:
  if (this.normalfunktion1() == this.normalfunktion2()) {
       funktion="x";
  } else {
     if (this.inormalfunktion1() == this.inormalfunktion2()) {
          funktion="1/x";
     } else {
           if (this.quadratfunktion1() == this.quadratfunktion2()) {
                funktion="x^2";
           } else {
               if (this.iquadratfunktion1() == this.iquadratfunktion2()) {
                    funktion="1/x^2";
               } else {
                      if (this.wurzelfunktion1() == this.wurzelfunktion2()) {
                              funktion="x^(1/2)";
                       } else {
                              if (this.iwurzelfunktion1() == this.iwurzelfunktion2()) {
                                   funktion="1/x^(1/2)";
                               } else {
                                   funktion="--";
                               }

                       }

               }
           }
     }
  }

Danke im Vorraus

Mit freundlichen Grüßen

Feuer1978
 
Das jetzt zu erklären macht eigentlich wenig Sinn.. ich denke mal aus dem Code kannst du selbst herauslesen, was ich meine.

Java:
float zahl1 = ... ;
float zahl2 = ... ;
float maxAbweichung = 0.15f; // = 15%

boolean identisch = Math.abs(zahl1 / zahl2 - 1.0f) <= maxAbweichung;

Achtung: mit dieser Variante musst du streng darauf achten, dass du immer mit
Code:
float
oder
Code:
double
rechnest da sonst auf ganzzahlen abgerundet wird und damit ist dein Vergleich fehlerhaft.
 
Zuletzt bearbeitet:
Naja du legst z.B eine variable an welche als toleranz dient

Java:
double range = 15.0;

anhand dieser kannst du dann die Methoden implementieren und eine Abweichung überprüfen , und dementsprechend reagieren.

kommt immer darauf an worauf genau du hinaus möchstest.

[EDIT]Tobse war schenller 😉[/EDIT]
 
Zuletzt bearbeitet:
Danke für die schnelle Antwort..

ich versteh was du meinst Tobse, aber habs grad versucht in meinen code einzuprogrammieren, was leider nicht geklappt hat ;(

Java:
  double d_funktion1_1=this.normalfunktion1();
  double d_funktion1_2=this.normalfunktion2();
  
  float funktion1_1=Float.valueOf(d_funktion1_1);
  float funktion1_2=Float.valueOf(d_funktion1_2);
  
  float maxAbweichung=0.15f;

  if (Math.abs(funktion1_1 / funktion1_2 - 1.0f) <= maxAbweichung;) {
       funktion="x";
  } else {
     if (this.inormalfunktion1() == this.inormalfunktion2()) {
          funktion="1/x";
     } else {...
 
Zuletzt bearbeitet:
aiaiaiiaia , sag uns doch mal bitte was genau dein konkretes Ziel ist.

Du solltest die funktionalität in Methoden kapsel, das mal vorab

sprich du erstellst für jeden schritt den du gesondert berechnen möchtest eine Methode, die je nach gewünschter funktionalität einen Rückgabewert hat

diesen kannst du dann z.B als Eingabeparameter einer anderen Funktion nutzen.
 
Zuletzt bearbeitet:
Also, die Methode "this.normalfunktion1()" und "this.normalfunktion2()" geben einen double wert aus. Sagen wir mal "this.normalfunktion1()" gibt 1.0 aus und "this.normalfunktion2()" gibt 1.5 aus.

Nun sollen beide ergebnisse der Methoden verglichen werden und nur eine Abweichung von ca. 15% besitzen -> dann ist die Aussage richtig und es folgt eine Antwort.

Bisher werden die ergebnisse der Methoden auf das Identische verglichen!

EDIT:

Hab die Lösung gefunden: Galileo Computing :: Java ist auch eine Insel – 2.7 Schleifen

Eine zweite Möglichkeit neben dem echten Kleiner-/Größer-Vergleich ist, eine erlaubte Abweichung (Delta) zu definieren. Mathematiker bezeichnen die Abweichung von zwei Werten mit dem griechischen Kleinbuchstaben Epsilon. Wenn wir einen Vergleich von zwei Fließkommazahlen anstreben und bei einem Gleichheitsvergleich eine Toleranz mit betrachten wollen, so schreiben wir einfach:

Java:
if ( Math.abs(x – y) <= epsilon )
  ...

Dann sieht mein code so aus:

Java:
if (Math.abs( this.normalfunktion1() - this.normalfunktion2()) <= 0.15f) {
       funktion="x";
  } else {
     if (Math.abs(this.inormalfunktion1() - this.inormalfunktion2()) <=0.15f) {
          funktion="1/x";
     } else {..

Danke für eure Hilfe!🙂
 
Zuletzt bearbeitet:
Versuch es mal hiermit:
Java:
public static boolean withinPercentageRange(double value, double test, double percentageRange)
    {
        return Math.abs(value / test - 1d) <= percentageRange;
    }
 
Ok, ähm... irgendwie klappts doch nicht ???:L???:L???:L

Java:
  public String vergleich(){
  
  double a=this.a;
  double b=this.b;
  String s_vergleich;
  
  if (Math.abs(a - b) <= 0.1f) {
       s_vergleich="identisch";
  } else {
       s_vergleich="nicht identsich";
  }
  
  return s_vergleich;
  }

falls a=9.5 und b=10 ist, kommt als antwort:"nicht identisch" obwohl es eine abweichung von 10% ist
 
Diese Zeile nochmal genau anschauen 😉

if (Math.abs(a - b) <= 0.1f)

schau mal ob du damit was anfangen kannst, ich übernehmen aber keinerlei Sicherheit falls was Rechnungstechnisches nicht stimmen sollte ^^ :

Java:
public class Foo {

	public static String getDeviation(double a , double b, double range){
		
		String result = "";
		double deviation = Math.abs(a / b - 1) * 100;
		
		if (deviation == range) {
			result = String.format("Die Abweichung beträgt %.1f %% und ist somit identisch.", deviation);
		}
		if (deviation < range) {
			result = String.format("Die Abweichung beträgt %.1f %% und liegt somit innerhalb der Range.", deviation);
		}
		if (deviation > range) {
			result = String.format("Die Abweichung beträgt %.1f %% und liegt somit außerhalb der Range.", deviation);
		}

		
		return result;
	}
	
	
	public static void main(String[] args) {
		System.out.println(Foo.getDeviation(1.15, 1, 1.0));
	}
}
 
Zuletzt bearbeitet:
Du rechnest auch
Code:
a  - b
, das ist die Differenz. Die Formeln für Prozentrechnung sind:

Prozentanteil A von B = (a / b) * 100

Ist A = 1,15 und B = 1 ist A 115% von B (Abweichung um 15%). Ist A = 0,87 und B = 1 ist A 87% von B (abweichung um 13%).

Wir rechnen also mit [c]p = a / b -1[/c]. Dann kommt folgendes bei raus:

Code:
a = 1,15
b = 1
p = 0,15 (a ist 15% größer als b)

a = 0.87
b = 1
p = -0,13 (a ist 13% kleiner als b)

Weil uns ja nur die Abweichung interessiert (aber nicht, in welche Richtung!) habe ich das
Code:
Math.abs
hinzugefügt.

Java:
flaot a = ... ;
float b = ... ;
float abweichung = 0.15f; // (15%)
if (a == b) {
    // a und b sind identisch
}
else if (Math.abs(a / b - 1f) <= abweichung) {
    // a und b sind änlich
}
else
{
    // a und b sind unterschiedlich
}
 

Zurück
Oben