/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
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

Søg
Reklame
Statistik
Spørgsmål : 177422
Tips : 31962
Nyheder : 719565
Indlæg : 6407886
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste