|  | 		    
					
        
         
          
         
	
          | |  | Problemer med et simpelt regnestykke Fra : Ace
 | 
 Dato :  03-02-11 15:03
 | 
 |  | 
 
            Hejsa
 Jeg sidder og bikser med et PHP-script, som skal lave et ret
 simpelt regnestykke.
 Regnestykket ser således ud: $tal3 = $tal1 * 100 / $tal2;
 Problemet er bare at resulatet, som scrrptet "spytter ud", ikke
 stemmer når man prøver at regne efter med en lommeregner.
 Meget simplificeret, ser kodningen sådan her ud:
 index.htm:
 <body>
 <form action="calculation.php" method="post">
 <input type="text" name="tal1" value="tal1">
 <input type="text" name="tal2" value="tal2">
 <input type="submit" value="Send">
 </form>
 </body>
 calculation.php:
 <?php
 $tal1 = $_REQUEST["tal1"];
 $tal2 = $_REQUEST["tal2"];
 $tal2 = number_format($tal2, 1, ',', '.');
 $tal3 = $tal1 * 100 / $tal2;
 $tal3 = number_format($tal3, 0, ',', '.');
 $data = "resultat.txt";
 if ($tal3) {
 $tal3 = "<div id='resultat'>$tal3</div>";
 $comfile = fopen ($data, "w");
 fwrite ($comfile, $tal3);
 fclose ($comfile);}
 ?>
 resultat.txt:
 <div id='resultat'>0</div>
 Ovenstående er i meget grove træk "the inner workings" af hvad
 jeg prøver på at få til at fungere.
 Men eksempelvis, da jeg testede med tal1=6 og tal2=5,7 blev
 resultat 120, hvor når jeg regner efter med en lommeregner (600
 delt med 5,7) får jeg resultatet til 105 :S
 Hvad er årsagen til dette?
 Venligst
 Ace
 -- 
 Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
  - Pædagogiske tutorials på dansk
  - Kom godt i gang med koderne
 KLIK HER! => http://www.html.dk/tutorials |  |  | 
  Bertel Lund Hansen (03-02-2011) 
 
	
          | |  | Kommentar Fra : Bertel Lund Hansen
 | 
 Dato :  03-02-11 15:39
 | 
 |  | 
 
            Ace skrev:
 > Meget simplificeret, ser kodningen sådan her ud:
 > index.htm:
 > <body>
 > <form action="calculation.php" method="post">
 > <input type="text" name="tal1" value="tal1">
 > <input type="text" name="tal2" value="tal2">
 > <input type="submit" value="Send">
 > </form>
 > </body>
 Det ser ud til at du kører med safemode disablet. Det kan ikke
 anbefales (men det giver ikke dit problem).
 number_format() returnerer en streng. Derudover ørger du for et
 dansk format som ødelægger det interne tal. Hvis man arbejder med
 "46,7", vil jeg gætte på at detb behandles som "46" plus en fejl.
 Derudover er det overflødigt at formatere mellemregninger selv om
 det kunne virke. Senere:
      $tal3 = "<div id='resultat'>$tal3</div>";
     
 Det er kun til forvirring pludselig at lade talvariablen
 indeholde en HTML-linje. Hold op med det.
 Prøv med:
 <?php
 $tal1 = $_REQUEST["tal1"];
 $tal2 = $_REQUEST["tal2"];
 $tal3 = $tal1 * 100 / $tal2;
 $tal3 = number_format($tal3, 0, ',', '.');
 $linje = "<div id='resultat'>$tal3</div>";
 $comfile = fopen ($data, "w");
 fwrite ($comfile, $linje);
 fclose ($comfile);
 ?>
 Test på at $tal3 ikke er 0 er fjernet. Et 0 er også et resultat.
 -- 
 Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/ |  |  | 
  Mads Lie Jensen (03-02-2011) 
 
	
          | |  | Kommentar Fra : Mads Lie Jensen
 | 
 Dato :  03-02-11 16:21
 | 
 |  | 
 
            On 03 Feb 2011 14:02:53 GMT, Ace <ace@clubace.dk> wrote:
 >Men eksempelvis, da jeg testede med tal1=6 og tal2=5,7 blev
 >resultat 120, hvor når jeg regner efter med en lommeregner (600
 >delt med 5,7) får jeg resultatet til 105 :S
 >
 >Hvad er årsagen til dette?
 Du bruger , som decimal-separator (hedder det det?). I php skal der
 bruges .
 Dvs. du sådan set skal skrive 5.7 for $tal2
 Problemet her er, at du får input "udefra", det vil php behandle som en
 streng, atlså "5,7". Nu prøver du at dividere med dette, php vil så
 forsøge at lave det til et tal, det bliver til 5.
 Så den regner sådan set godt nok, php jonglerer bare anderledes rundt
 med dine tal end du tror.
 -- 
 Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
 Gartneriet - http://www.gartneriet.dk/ |  |  | 
  Ace (04-02-2011) 
 
	
          | |  | Kommentar Fra : Ace
 | 
 Dato :  04-02-11 10:23
 | 
 |  | 
 
            Mads Lie Jensen forklarede: 
 > Du bruger , som decimal-separator (hedder det det?). I php skal der 
 > bruges . 
 > Dvs. du sådan set skal skrive 5.7 for $tal2 
 >  
 > Problemet her er, at du får input "udefra", det vil php behandle som en 
 > streng, atlså "5,7". Nu prøver du at dividere med dette, php vil så 
 > forsøge at lave det til et tal, det bliver til 5. 
 >  
 > Så den regner sådan set godt nok, php jonglerer bare anderledes rundt 
 > med dine tal end du tror. 
 Tak Mads, for den forklaring :)
 Vil det så sige at der overhovedet ikke er nogen måde hvorpå man kan få
 der til at stå et , i stedet for et . som decimal seperator, uden at den
 forsøger at lave resutatet til et helt tal?
 Venligst
 Ace
 -- 
 Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
  - Pædagogiske tutorials på dansk
  - Kom godt i gang med koderne
 KLIK HER! => http://www.html.dk/tutorials |  |  | 
   Bertel Lund Hansen (04-02-2011) 
 
	
          | |  | Kommentar Fra : Bertel Lund Hansen
 | 
 Dato :  04-02-11 10:49
 | 
 |  | 
 
            Ace skrev:
 > Vil det så sige at der overhovedet ikke er nogen måde hvorpå man kan få
 > der til at stå et , i stedet for et . som decimal seperator, uden at den
 > forsøger at lave resutatet til et helt tal?
 Nej, det vil det ikke sige.
 Formatering skal først laves når noget skal vises for brugeren.
 Når der regnes, er der kun ét format der kan bruges, og det er
 uden tusindskiller og med engelsk decimaltegn (punktum).
 $resultat = 276.495*12.74/11.3;
 echo number_format($resultat,2,',','.');
 -- 
 Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/ |  |  | 
   Mads Lie Jensen (04-02-2011) 
 
	
          | |  | Kommentar Fra : Mads Lie Jensen
 | 
 Dato :  04-02-11 13:34
 | 
 |  | 
 
            On 04 Feb 2011 09:22:46 GMT, Ace <ace@clubace.dk> wrote:
 >> Problemet her er, at du får input "udefra", det vil php behandle som en 
 >> streng, atlså "5,7". Nu prøver du at dividere med dette, php vil så 
 >> forsøge at lave det til et tal, det bliver til 5. 
 >>  
 >> Så den regner sådan set godt nok, php jonglerer bare anderledes rundt 
 >> med dine tal end du tror. 
 >
 >Tak Mads, for den forklaring :)
 >
 >Vil det så sige at der overhovedet ikke er nogen måde hvorpå man kan få
 >der til at stå et , i stedet for et . som decimal seperator, uden at den
 >forsøger at lave resutatet til et helt tal?
 Tjo, du kan godt. Det er bare ikke helt nemt .... vi danskere bruger jo
 , som decimal-separator, og evt. . som tusindtalseparator: 1.000,00
 Php er, som mange andre programmeringssprog, bygget op omkring engelsk,
 hvor det er lige omvendt: 1,000.00
 Du vil hente tallene fra brugeren, via en formular. Og så er det at det
 bliver svært. Hvis du altid er helt sikker på at , er brugt som
 kommatalseparator, kan du starte med at fjerne alle . fra tallet, og
 derefter udskifte , med . Så kan det bruges som et tal. 
 Den går bare ikke hvis det er en amerikaner som har indtastet tallet,
 for laver du 1,000.00 på den måde, vil det blive til 1.000,00, som php
 så vil bruge som et 1-tal .....
 -- 
 Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
 Gartneriet - http://www.gartneriet.dk/ |  |  | 
  scootergrisen (03-02-2011) 
 
	
          | |  | Kommentar Fra : scootergrisen
 | 
 Dato :  03-02-11 19:56
 | 
 |  | Hvis det med at skrive punktum (.) istedet for komma (,) i tal ikke virker.
 
 Altså 100.50 i stedet for 100,50 så kan det måske være fordi PHP ikke
 har fået besked på hvad der skal udregnes først.
 
 Når du skriver :
 $tal3 = $tal1 * 100 / $tal2;
 
 Så kunne det måske være at PHP siger 100 / $tal2 først.
 
 Så prøv at skriv :
 $tal3 = ($tal1 * 100) / $tal2;
 
 Så tror jeg nok det betyder at $tal1 * 100 skal regnes ud først.
 
 Ellers kan du skrive :
 
 $tal3 = $tal1 * 100;
 $tal3 = $tal3 / $tal2;
 
 
 Og hvis du gerne vil skrive komma (,) i din form så laver du bare en :
 $inputdata = str_replace(',', '.', $inputdata);
 
 
 |  |  | 
  Mads Lie Jensen (03-02-2011) 
 
	
          | |  | Kommentar Fra : Mads Lie Jensen
 | 
 Dato :  03-02-11 21:16
 | 
 |  | 
 
            On Thu, 03 Feb 2011 19:56:22 +0100, scootergrisen
 <scootergrisen@NOSPANKYOUgmail.com> wrote:
 >Hvis det med at skrive punktum (.) istedet for komma (,) i tal ikke virker.
 >
 >Altså 100.50 i stedet for 100,50 så kan det måske være fordi PHP ikke 
 >har fået besked på hvad der skal udregnes først.
 >
 >Når du skriver :
 >$tal3 = $tal1 * 100 / $tal2;
 >
 >Så kunne det måske være at PHP siger 100 / $tal2 først.
 Tanken er god nok    Men * (gange) og / (division) binder lige hårdt,
 og så regnes der fra venstre mod højre, så i det regnestykke gør det
 ingen forskel.
 Se evt. <http://dk2.php.net/manual/en/language.operators.precedence.php> >Så prøv at skriv :
 >$tal3 = ($tal1 * 100) / $tal2;
 >
 >Så tror jeg nok det betyder at $tal1 * 100 skal regnes ud først.
 Det betyder det, men det er i forvejen sådan php regner dette
 regnestykke ud. Men er man i tvivl er det altid en god ide med
 paranteser.
 -- 
 Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
 Gartneriet - http://www.gartneriet.dk/ |  |  | 
   Chano Andersen (03-02-2011) 
 
	
          | |  | Kommentar Fra : Chano Andersen
 | 
 Dato :  03-02-11 21:50
 | 
 |  | Den 03-02-2011 21:15, Mads Lie Jensen skrev:
 > On Thu, 03 Feb 2011 19:56:22 +0100, scootergrisen
 > <scootergrisen@NOSPANKYOUgmail.com>  wrote:
 
 >> Så prøv at skriv :
 >> $tal3 = ($tal1 * 100) / $tal2;
 >>
 >> Så tror jeg nok det betyder at $tal1 * 100 skal regnes ud først.
 >
 > Det betyder det, men det er i forvejen sådan php regner dette
 > regnestykke ud. Men er man i tvivl er det altid en god ide med
 > paranteser.
 >
 
 Ja, sådan BURDE det måske være, men i praksis er det min erfaring, at
 man altid bør sikre at tingene regnes korrekt, ved at bruge
 parenteserne... Hellere sætte en parentes for meget, end en for lidt. ;)
 
 Uanset hvordan man vender og drejer det, så skader det i hvert fald ikke
 at man definere rækkefølgen ved brug af parenteser.
 
 - Chano Andersen
 
 
 |  |  | 
 |  |