Welcome to the LimeSurvey Community Forum

Ask the community, share ideas, and connect with other LimeSurvey users!

WTP abfragen

  • Lena_12345
  • Lena_12345's Avatar Topic Author
  • Offline
  • Senior Member
  • Senior Member
More
2 years 2 months ago #229613 by Lena_12345
Replied by Lena_12345 on topic WTP abfragen
Hallo!
Ich brauche nochmal Hilfe.
Ich hoffe Sie können mir sagen, inwiefern ich meinen Gleichung abändern muss.
Und zwar werden meine Zahlen jetzt zu stark gerundet. Wenn man z.B. 1,50 ausgibt müsste bei einer Preiserhöhung von 10% ja der neue Preis bei 1,65 liegen. Nun wird mir aber 1,70 angezeigt und eine Preiserhöhung von 20 Cent.

Ich habe folgende Formel verwendet:

Für die Preiserhöhnung:
f
Bedingte Bearbeitung; if(test,result_if_true[,result_if_false = ''])
(strpos(fixnum(round((round((ExpendituresPrevious * (WTP / 100)), 2)), 1)), ',') == 0, join(fixnum(round((round((ExpendituresPrevious * (WTP / 100)), 2)), 1)), ',00'), if(strpos(fixnum(round((round((ExpendituresPrevious * (WTP / 100)), 2)), 1)), ',') == strlen(fixnum(round((round((ExpendituresPrevious * (WTP / 100)), 2)), 1))) - 2, join(fixnum(round((round((ExpendituresPrevious * (WTP / 100)), 2)), 1)), '0'), fixnum(round((round((ExpendituresPrevious * (WTP / 100)), 2)), 1))))


für den neuen Preis:
if(strpos(fixnum(round((round(sum(ExpendituresPrevious, ExpendituresPrevious * WTP / 100), 2)), 1)), ',') == 0, join(fixnum(round((round(sum(ExpendituresPrevious, ExpendituresPrevious * WTP / 100), 2)), 1)), ',00'), if(strpos(fixnum(round((round(sum(ExpendituresPrevious, ExpendituresPrevious * WTP / 100), 2)), 1)), ',') == strlen(fixnum(round((round(sum(ExpendituresPrevious, ExpendituresPrevious * WTP / 100), 2)), 1))) - 2, join(fixnum(round((round(sum(ExpendituresPrevious, ExpendituresPrevious * WTP / 100), 2)), 1)), '0'), fixnum(round((round(sum(ExpendituresPrevious, ExpendituresPrevious * WTP / 100), 2)), 1))))

Please Log in to join the conversation.

  • Lena_12345
  • Lena_12345's Avatar Topic Author
  • Offline
  • Senior Member
  • Senior Member
More
2 years 2 months ago #229614 by Lena_12345
Replied by Lena_12345 on topic WTP abfragen
Ok, ich habe es nun selbst gelöst und frage mich wieso ich darauf nicht schon vorher gekommen bin. Manchmal hat man echt ein Brett vor dem Kopf wenn man schon den ganzen Tag an seinem Fragebogen sitzt...

Please Log in to join the conversation.

  • holch
  • holch's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 years 2 months ago #229615 by holch
Replied by holch on topic WTP abfragen

Ok, ich habe es nun selbst gelöst


Wäre natürlich super wenn du erklären würdest, was falsch war und wie du es korrigiert hast, für all die die später mit einem ähnlichen Probem auf deinen Post stossen.

I answer at the LimeSurvey forum in my spare time, I'm not a LimeSurvey GmbH employee.
No support via private message.

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 years 2 months ago #229616 by Joffm
Replied by Joffm on topic WTP abfragen
Ich denke, das ist es, was Du gemerkt hast.
Nämlich, dass Du ja nur auf eine Stele rundest, dann aber zwei Kommastellen erzwingst.
Dies war ja etwas, was in einem anderen Thread von dem damaligen Threadersteller gewünscht war.

Ichhabe mich den hanzen Abend gefragt, was diese doppelte Rundung bezwecken soll.
Außer dass diese Art der Rundung natürlich in manchen Fällen ein falsches Ergebnis ergibt..
Nehmen wir  als ungerundete Zahl 12.3482
Wen man direkt auf eine Stelle rundet, ergibt sich: 12.3
Rundet man aber wie Du zunächst aif zwei Stellen, erhält man 12.35. Und dies auf eine Stelle gerundet, gibt 12.4

Ich hatte es ja schon früher einmal geschrieben: Besser ist es, die beiden Rechenschritte zu trennen.
Berechne zunächst in einer Gleichung die Erhöhung, danach in einer zweiten die gerundete Darstellung.
Es ist einfach "rechenzeitverbratend", die Berechnung der Erhöhung jedesmal aufs Neue in der IF-Geschicte vorzunehmen.

Joffm

Volunteers are not paid.
Not because they are worthless, but because they are priceless
The following user(s) said Thank You: Lena_12345

Please Log in to join the conversation.

  • Lena_12345
  • Lena_12345's Avatar Topic Author
  • Offline
  • Senior Member
  • Senior Member
More
2 years 2 months ago #229617 by Lena_12345
Replied by Lena_12345 on topic WTP abfragen
Ich habe einfach die die 1 in der Gleichung zu einer 2 geändert und jetzt ist das Ergebnis genau richtig gerundet:
if(test,result_if_true[,result_if_false = ''])
(strpos(fixnum(round((round((ExpendituresPrevious * (WTP / 100)), 2)), 2)), ',') == 0, join(fixnum(round((round((ExpendituresPrevious * (WTP / 100)), 2)), 2)), ',00'), if(strpos(fixnum(round((round((ExpendituresPrevious * (WTP / 100)), 2)), 2)), ',') == strlen(fixnum(round((round((ExpendituresPrevious * (WTP / 100)), 2)), 2))) - 2, join(fixnum(round((round((ExpendituresPrevious * (WTP / 100)), 2)), 2)), '0'), fixnum(round((round((ExpendituresPrevious * (WTP / 100)), 2)), 2))))

Die Formel sieht sehr lang und kompliziert aus, aber am Ende kommt das richtige bei raus :D

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 years 2 months ago - 2 years 2 months ago #229618 by Joffm
Replied by Joffm on topic WTP abfragen
Aber erläutere doch bitte, warum Du zweimal rundest!
Deine Formel macht doch dieses, von innen nach außen aufgedröselt (dabei alle überflüssigen Klammern entfernt) :

if( strpos(fixnum(round(round(ExpendituresPrevious * WTP / 100, 2),2)),',')==0
 
  1. Berechne den Erhöhungsbetrag, multipliziere "ExpendituresPrevious" mit "WTP" und dividiere durch 100:
    ExpendituresPrevious * WTP / 100
     
  2. Runde das Ergebnis auf zwei Nachkommastellen: 
    round(ExpendituresPrevious * WTP / 100, 2)
     
  3. Runde das Ergebnis noch einmal auf zwei Nachkommastellen: 
    round(round(ExpendituresPrevious * WTP / 100, 2),2)
     
  4. Konvertiere das Ergebnis zu Text:
    fixnum(round(round(ExpendituresPrevious * WTP / 100, 2),2))
    Erläuterung im Handbuch:  fixnum  Display numbers with comma as radix separator, if needed   string fixnum(number) <- aus "number" wird "string"
     
  5. Stelle fest, an welcher Stelle ein Komma vorkommt:
    strpos(fixnum(round(round(ExpendituresPrevious * WTP / 100, 2),2)),',')
     
  6. Entscheide, was passiert, wenn kein Komma vorkommt: 
    if( strpos(fixnum(round(round(ExpendituresPrevious * WTP / 100, 2),2)),',')==0
  
Und jetzt ist die Frage, warum Du in Schritt 2 und 3 eine Zahl wie  12,34567 zunächst zu 12,35 rundest (2) und dann diese Zahl erneut auf zwei Stellen rundest (3).
Da wird kein anderes Ergebnis zu erwarten sein als eben 12,35..

Du machst Dir das Leben unnötig schwer.
a. Durch die schiere Länge ist die Formel schwer zu überblicken.
b. Durch die wiederholte Anwendung sind Änderungen an vielen verschiedenen Stellen durchzuführen.

Daher noch einmal - dann aber auch zum letzten Mal - der Ratschlag:
Lagere Teile, die wiederholt benötigt werden aus!
In Deinem Fall ist dies die Berechnung des Wertes der Erhöhung.
Diese berechnest Du separat in einer Gleichung (EQ1)
{fixnum(round(ExpendituresPrevious * WTP / 100, 2))}

Dann muss im verschachtelten IF diese Berechnung nicht wieder und wieder durchgeführt werden.
Außerdem sind Änderungen (z.B. 1 oder 3 Kommastellen, Umbenennung der Variablen) nur an einer einzigen Stelle durchzuführen.

Dann verkürzt sich das IF zu:
{if(strpos(EQ1, ',') == 0, join(EQ1, ',00'), if(strpos(EQ1, ',') == strlen(EQ1) - 2, join(EQ1, '0'), EQ1))}
Außerdem kannst diese Gleichung nun universell benutzen, um Zahlen mit erzwungenen zwei Nachkommastellen anzuzeigen.
Es wird nur EQ1 durch eine andere Gleichung (EQ2) ersetzt, in welcher eine Zahl mit einer völlig anderen Formel als der obigen berechnet wird.

Joffm
 

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 2 years 2 months ago by Joffm.

Please Log in to join the conversation.

  • Lena_12345
  • Lena_12345's Avatar Topic Author
  • Offline
  • Senior Member
  • Senior Member
More
2 years 2 months ago #229653 by Lena_12345
Replied by Lena_12345 on topic WTP abfragen
Ja das ist natürlich wirklich einfacher…
Danke! Ich habe meine Formel so wie vorgeschlagen abgeändert.

Please Log in to join the conversation.

Moderators: holchJoffmtpartner

Lime-years ahead

Online-surveys for every purse and purpose