0 votes
in SoSci Survey (dt.) by s222544 (565 points)

Hallo SoSci Survey Online Support,

vielen Dank für Ihre Hilfe in meinem Projekt!

Als Ergänzung in meinem Experiment möchte ich Veränderungen in der Gewichtung mittels der Formel ((neues Gewicht- altes Gewicht)/altes Gewicht)*100 anzeigen.

Hier ist der PHP Code, den ich für die Formel verwende:

$change_cash1 = (($weight_cash1-$bargeld1)/$bargeld1)*100;

$weight_cash1 ist das neue Gewicht; $bargeld1 das alte Gewicht.

Debug der einzelnen Elemente ergibt $weight_cash1 = 43.828342618384 (double) und $bargeld1 = 50 (string), also, dass alles funktioniert (meiner Meinung nach).

Als Antwort sollte -12,34% auftreten.

Nur im Fragenbogen erscheint dieser Fehler:
Im PHP-Code trat ein Fehler auf.

Fehler im Fragebogen: Uncaught DivisionByZeroError: Division by zero in /var/www/s2survey/html/lib/s2survey/phpcode/PHPCodeExecutor.php(547) : eval()'d code:46 Stack trace: #0 /var/www/s2survey/html/lib/s2survey/phpcode/PHPCodeExecutor.php(547): eval() #1 /var/www/s2survey/html/lib/s2survey/questionnaire/php/PHPCodeExecutorQnr.php(63): s2survey\phpcode\PHPCodeExecutor->runCode() #2 /var/www/s2survey/html/inc/QuestionnairePHP.php(563): s2survey\questionnaire\php\PHPCodeExecutorQnr->runCode() #3 /var/www/s2survey/html/lib/s2survey/questionnaire/QuestionnaireElement.php(480): QuestionnairePHP->runElement() #4 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1516): s2survey\questionnaire\QuestionnaireElement->run() #5 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1435): s2survey\questionnaire\QnrPage->runContent() #6 /var/www/s2survey/html/inc/InterviewCase.php(1469): s2survey\questionnaire\QnrPage->run() #7 /var/www/s2survey/html/inc/Interviewer.php(655): InterviewCase->createQuestionnairePage() #8 /var/www/s2survey/html/inc/Interviewer.php(824): Interviewer->handleCreate() #9 /var/www/s2survey/html/inc/Interviewer.php(1951): Interviewer->handleInterview() #10 /var/www/s2survey/html/acb/index.php(4): Interviewer::run() #11 {main} thrown
Zeile: 46

PHP-Code

043  
044  
045 
046 $change_cash1 = (($weight_cash1-$bargeld1)/$bargeld1)*100;
047 $change_ak1 = (($weight_ak1-$aktien1)/$aktien1)*100;
048 $change_bo1 = (($weight_bo1-$bonds1)/$bonds1)*100;
049 $change_go1 = (($weight_go1-$gold1)/$gold1)*100;

Wie kann ich den Fehler beheben?
Vielen Dank für die Hilfe!

1 Answer

0 votes
by SoSci Survey (305k points)

Uncaught DivisionByZeroError: Division by zero

Findfen wir doch erst einmal heraus, wo die Division durch 0 stattfindet. Ergänzen Sie vor dem $change_cash1 = ... doch bitte einmal

debug($bargeld1);
debug($aktien1);
debug($bonds1);
debug($gold1);

Debug der einzelnen Elemente ergibt $weight_cash1 = 43.828342618384 (double)

Das ist soweit ja gut ... daher vermute ich auch, dass das Problem nicht in der ersten Zeile liegt. Um die Formatierung der Zahl können wir uns später kümmern.

Ob die Formel tatsächlich hilfreich ist, kommt auf den Wertebereich an. Wenn der alte Wert nahe 0 (oder gar 0) ist, dann weicht der neue Wert davon im Verhältnis natürlich immer rießig ab. 0,1 / 0,0000001 ist auch 1 Mio. Da müssten Sie vielleicht überlegen, was Sie mit diesem Wert überhaupt aussagen möchten. Vielleicht tut es ja auch die einfache Differenz.

by s222544 (565 points)
Vielen Dank für Ihre Antwort.

$bargeld1, $aktien1, $bonds1 und $gold1 werden vom Probanden auf der ersten Seite angegeben und können tatsächlich Null sein, die Summer aller Zahlen muss nur 100 sein.
Gerade habe ich keine Nullen angegeben, sondern ganze Zahlen.
Trotzdem erscheint folgende Meldung:

Im PHP-Code trat ein Fehler auf.

Fehler im Fragebogen: Uncaught DivisionByZeroError: Division by zero in /var/www/s2survey/html/lib/s2survey/phpcode/PHPCodeExecutor.php(547) : eval()'d code:56 Stack trace: #0 /var/www/s2survey/html/lib/s2survey/phpcode/PHPCodeExecutor.php(547): eval() #1 /var/www/s2survey/html/lib/s2survey/questionnaire/php/PHPCodeExecutorQnr.php(63): s2survey\phpcode\PHPCodeExecutor->runCode() #2 /var/www/s2survey/html/inc/QuestionnairePHP.php(563): s2survey\questionnaire\php\PHPCodeExecutorQnr->runCode() #3 /var/www/s2survey/html/lib/s2survey/questionnaire/QuestionnaireElement.php(480): QuestionnairePHP->runElement() #4 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1516): s2survey\questionnaire\QuestionnaireElement->run() #5 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1435): s2survey\questionnaire\QnrPage->runContent() #6 /var/www/s2survey/html/inc/InterviewCase.php(1469): s2survey\questionnaire\QnrPage->run() #7 /var/www/s2survey/html/inc/Interviewer.php(655): InterviewCase->createQuestionnairePage() #8 /var/www/s2survey/html/inc/Interviewer.php(824): Interviewer->handleCreate() #9 /var/www/s2survey/html/inc/Interviewer.php(1951): Interviewer->handleInterview() #10 /var/www/s2survey/html/acb/index.php(4): Interviewer::run() #11 {main} thrown
Zeile: 56

PHP-Code

053 debug($weight_bo1);
054 debug($weight_go1);
055
056 $change_cash1 = (($weight_cash1-$bargeld1)/$bargeld1)*100;
057 $change_ak1 = (($weight_ak1-$aktien1)/$aktien1)*100;
058 $change_bo1 = (($weight_bo1-$bonds1)/$bonds1)*100;
059 $change_go1 = (($weight_go1-$gold1)/$gold1)*100;

Wenn ich aber alle $change_ Zeilen als Kommentar markiere, erscheint keine Fehlermeldung.

Vielen Dank für Ihre Hilfe!
by SoSci Survey (305k points)
> Wenn ich aber alle $change_ Zeilen als Kommentar markiere, erscheint keine Fehlermeldung.

Dann probieren Sie bitte mal, nur eine so zu markieren, sodass wir sehen, welche das Problem verursacht.

Sie können auch alle auskommentieren und mittels debug() anzeigen lassen, was in den Variablen gespeichert ist. Irgendwo muss die 0 ja sein ;)
by s222544 (565 points)
Kluge Antwort - gefällt mir! ;)
Vielen Dank für Ihren Tipp, ich konnte dieses Problem beheben!

Könnten Sie mir bitte bei meinem nächsten Problem helfen?

Die Veränderungen in der Gewichtungen werden mit Dezimalpunkt angezeigt anstatt dem üblichen Komma. In früheren Vortests hat das die Probanden verwirrt, weshalb ich gerne ein Komma hätte: z.B. steht bei Tagesgeld als Veränderung -12.72%, was ich gerne als -12,72 anzeigen möchte.

Ich habe versucht folgenden PHP Code zu benutzen: replace($change_cash1, str_replace('.', ',', value($change_cash1)));

und darunter: html('<p> Tagesgeld: '.sprintf('%1.2f', $change_cash1).'%</p>');

Es kam der Fehler auf, dass $change_cash1 doppelt benutzt wird.

Vielen Dank im Voraus!
by s222544 (565 points)
Wie Sie auch richtig vorhergesagt haben, kommen ebenfalls Fehler, wenn von Probanden eine Null eingegeben wird.
Deshalb habe ich folgenden PHP Code versucht:

if (int)value('TE01_01')== 0{
    html('<p> Keine Berechnung möglich.</p>');
    } elseif (int)(value('TE01_02')== 0) {
    html('<p> Keine Berechnung möglich.</p>');
    } elseif (int)(value('TE01_03')== 0) {
    html('<p> Keine Berechnung möglich.</p>');
    } elseif (int)(value('TE01_04')== 0) {
    html('<p> Keine Berechnung möglich.</p>');
    }

Leider kommen auch hier Fehler auf zumal auch mehr als eins der 4 Felder Null sein kann. Z.B. Könnte man nur in einem Feld eine Gewichtung von 100 haben und folglich die drei anderen frei lassen.

Kann ich wenn mehr als ein Feld von TE01_ (die Ursprungseingabe vom Probanden) eine Null hat, '<p> Keine Berechnung möglich.</p>' anzeigen lassen und die betroffenen $change_ Kalkulationen überspringen?

Vielen Dank für Ihre Unterstützung!
by SoSci Survey (305k points)
> Leider kommen auch hier Fehler

Da fehlen Klammern. Die komplette Bedingung einer IF-Konstruktion muss in Klammern stehen, also

if ((int)value('TE01_01') == 0) {
    html('<p> Keine Berechnung möglich.</p>');
} else {
  $bargeld1 = value('TE01_01');
  $change = (($weight_cash1-$bargeld1)/$bargeld1)*100;
  html('<p>Änderung: '.sprintf('%01.2f', $change).'</p>');
}

Das elseif in Ihrem Code macht nur bedingt Sinn - ich denke, Sie brauchen 4-mal if/else
by s222544 (565 points)
Vielen Dank, habe jetzt 4 if/ else Statements, alles funktioniert!

Könnten Sie mir bitte noch mit der Punkt/ Komma Anzeige helfen?

Die Veränderungen in der Gewichtungen werden mit Dezimalpunkt angezeigt anstatt dem üblichen Komma. In früheren Vortests hat das die Probanden verwirrt, weshalb ich gerne ein Komma hätte: z.B. steht bei Tagesgeld als Veränderung -12.72%, was ich gerne als -12,72% anzeigen möchte.

Ich habe versucht folgenden PHP Code zu benutzen: replace($change_cash1, str_replace('.', ',', value($change_cash1)));

und darunter: html('<p> Tagesgeld: '.sprintf('%1.2f', $change_cash1).'%</p>');

Es kam der Fehler auf, dass $change_cash1 im replace() doppelt benutzt wird.

Vielen Dank im Voraus!
by SoSci Survey (305k points)
> Könnten Sie mir bitte noch mit der Punkt/ Komma Anzeige helfen?

Das hilft ein str_replace()

html('<p> Tagesgeld: '.str_replace('.', ',', sprintf('%1.2f', $change_cash1)).'%</p>');

Oder Sie nehmen den Automatismus in SoSci:

replace('%anteil%', $change_cash1);
html('<p> Tagesgeld: %anteil%</p>');
by s222544 (565 points)
Vielen Dank! Alles funktioniert!

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...