Afronding berekening (totaalprijs) gaat fout
Ik zit even met een klein mysterie.. Voor de berekening van een Totaalprijs (aantal x prijskeuze) waarbij ik decimalen met een . invoer en dus niet met een , (komma) en waarbij ik het aantal en prijskeuze post en vervolgens vermenigvuldig met: sprintf("%01.2f",) word de output verkeerd afgerond: bedragen achter de . worden niet meegerekend.
voorbeeld: (form input)
Quote:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
$fields_3 = array("Aantal1" => "1",
"Aantal2" => "1",
"Aantal3" => "3",
"Aantal4" => "3"
);
foreach($fields_3 as $field => $value)
{
$type = "text";
$placeholder3= "Aantal";
echo "<div id='field'><input id='$field' name='$field' type='$type' value='".@$$field."' size='3' maxlength='10' placeholder='$placeholder3' /> <b>x</b> </div>"; }
$fields_5 = array("Prijskeuze1" => "2.50",
"Prijskeuze2" => "3.00",
"Prijskeuze3" => "1.25",
"Prijskeuze4" => "2.50"
);
foreach($fields_5 as $field => $value)
{
$type = "text";
$placeholder4= "Prijs p/stuk";
echo "<div id='field'><input id='$field' name='$field' type='$type' value='".@$$field."' size='5' maxlength='10' placeholder='$placeholder4' /></div>"; }
?>
$fields_3 = array("Aantal1" => "1",
"Aantal2" => "1",
"Aantal3" => "3",
"Aantal4" => "3"
);
foreach($fields_3 as $field => $value)
{
$type = "text";
$placeholder3= "Aantal";
echo "<div id='field'><input id='$field' name='$field' type='$type' value='".@$$field."' size='3' maxlength='10' placeholder='$placeholder3' /> <b>x</b> </div>"; }
$fields_5 = array("Prijskeuze1" => "2.50",
"Prijskeuze2" => "3.00",
"Prijskeuze3" => "1.25",
"Prijskeuze4" => "2.50"
);
foreach($fields_5 as $field => $value)
{
$type = "text";
$placeholder4= "Prijs p/stuk";
echo "<div id='field'><input id='$field' name='$field' type='$type' value='".@$$field."' size='5' maxlength='10' placeholder='$placeholder4' /></div>"; }
?>
vervolgens gaat deze input doormiddel van POST naar invoer.php:
Quote:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?
require_once '../../misc/log_config.inc.php';
$Id= $_POST['Id'];
$Aantal1 = $_POST['Aantal1'];
$Aantal2 = $_POST['Aantal2'];
$Aantal3 = $_POST['Aantal3'];
$Aantal4 = $_POST['Aantal4'];
$Prijskeuze1 = $_POST['Prijskeuze1'];
$Prijskeuze2 = $_POST['Prijskeuze2'];
$Prijskeuze3 = $_POST['Prijskeuze3'];
$Prijskeuze4 = $_POST['Prijskeuze4'];
$Totaalprijs1= sprintf("%01.2f",$Aantal1*$Prijskeuze1);
$Totaalprijs2= sprintf("%01.2f",$Aantal2*$Prijskeuze2);
$Totaalprijs3= sprintf("%01.2f",$Aantal3*$Prijskeuze3);
$Totaalprijs4= sprintf("%01.2f",$Aantal4*$Prijskeuze4);
$sUpdatequery = "UPDATE Bestelling SET
Aantal1='$Aantal1',Aantal2='$Aantal2',Aantal3='$Aantal3',Aantal4='$Aantal4',
Prijskeuze1='$Prijskeuze1',Prijskeuze2='$Prijskeuze2',Prijskeuze3='$Prijskeuze3',
rijskeuze4='$Prijskeuze4',
Totaalprijs1='$Totaalprijs1',Totaalprijs2='$Totaalprijs2',Totaalprijs3='$Totaalprijs3',
Totaalprijs4='$Totaalprijs4',
WHERE Id='$Id'";
$rDatabaseverbinding = mysql_connect(MYSQL_SERVER, MYSQL_GEBRUIKERSNAAM, MYSQL_WACHTWOORD) or die(mysql_error());
mysql_select_db(MYSQL_DATABASENAAM) or die(mysql_error());
$rRecordset = mysql_query($sUpdatequery) or die(mysql_error());
echo "<center><strong>De Bestelling is opgeslagen!</strong>,</center></br></br>\n";
?>
require_once '../../misc/log_config.inc.php';
$Id= $_POST['Id'];
$Aantal1 = $_POST['Aantal1'];
$Aantal2 = $_POST['Aantal2'];
$Aantal3 = $_POST['Aantal3'];
$Aantal4 = $_POST['Aantal4'];
$Prijskeuze1 = $_POST['Prijskeuze1'];
$Prijskeuze2 = $_POST['Prijskeuze2'];
$Prijskeuze3 = $_POST['Prijskeuze3'];
$Prijskeuze4 = $_POST['Prijskeuze4'];
$Totaalprijs1= sprintf("%01.2f",$Aantal1*$Prijskeuze1);
$Totaalprijs2= sprintf("%01.2f",$Aantal2*$Prijskeuze2);
$Totaalprijs3= sprintf("%01.2f",$Aantal3*$Prijskeuze3);
$Totaalprijs4= sprintf("%01.2f",$Aantal4*$Prijskeuze4);
$sUpdatequery = "UPDATE Bestelling SET
Aantal1='$Aantal1',Aantal2='$Aantal2',Aantal3='$Aantal3',Aantal4='$Aantal4',
Prijskeuze1='$Prijskeuze1',Prijskeuze2='$Prijskeuze2',Prijskeuze3='$Prijskeuze3',
rijskeuze4='$Prijskeuze4',
Totaalprijs1='$Totaalprijs1',Totaalprijs2='$Totaalprijs2',Totaalprijs3='$Totaalprijs3',
Totaalprijs4='$Totaalprijs4',
WHERE Id='$Id'";
$rDatabaseverbinding = mysql_connect(MYSQL_SERVER, MYSQL_GEBRUIKERSNAAM, MYSQL_WACHTWOORD) or die(mysql_error());
mysql_select_db(MYSQL_DATABASENAAM) or die(mysql_error());
$rRecordset = mysql_query($sUpdatequery) or die(mysql_error());
echo "<center><strong>De Bestelling is opgeslagen!</strong>,</center></br></br>\n";
?>
nu zou die dus als resultaat moeten teruggeven en opslaan:
$Totaalprijs1 = "2.50" //1x 2.50
$Totaalprijs2 = "3.00" // 1x 3.00
$Totaalprijs3 = "3.75" // 3 x 1.25
$Totaalprijs4 = "7.50" // 3 x 2.50
Maar nu krijg ik:
$Totaalprijs1 = "2,50"
$Totaalprijs2 = "3,00"
$Totaalprijs3 = "3,75"
$Totaalprijs4 = "7,50"
Vervolg berekening(en) gaan vervolgens niet goed in afronding omdat de input . nu ineens een , is geworden.
Het lijkt erop dat het script van de input . een komma maakt als decimaal en daardoor niet goed afrond. Mijn vraag is hoe dit mogelijk is en wat ik wellicht fout doe. De invoer gaat correct met een . als decimaal. Voor een juiste berekening moet dit ook een . blijven.
Ik vermoed dat er ergens in het dynamische input form iets niet goed gaat. Als ik het input form in een niet dynamische form uitvoer, gaat het wel goed.
Hopelijk heb ik het duidelijk uitgelegd wat het probleem is en kan iemand mij helpen met een oplossing
Gewijzigd op 04/09/2016 14:48:26 door N tigerrag
De function sprintf() geeft een geformatte string terug. Waarschijnlijk staat de server ingesteld op NL en dan is het logisch dat er een komma in staat. Sla nooit geformatte data op in de database, dan heb je dit probleem niet. Verder is het niet nodig om de totaalprijs op te slaan, die kun je namelijk altijd berekenen uit de databasegegevens.
inderdaad dubbel om de totaalprijs op te slaan. Echter als deze berekening via een html form input laat uitvoeren door invoer.php dan geeft het wel de punten terug ipv komma. Server instelling is niets aan veranderd dus het zou moeten werken.
Jij bedoelt dat de totalen geformatte pas laat uitrekenen bij een weergave op het scherm ipv opslaan?
Ik vind het raar dat het script met een dynamisch form de invoer . omzet een , zonder dat ik er om vraag.
php.net:
Dus als het op NL staat krijg je een komma.
Van Quote:
f - the argument is treated as a float, and presented as a floating-point number (locale aware).
Dus als het op NL staat krijg je een komma.
Gewijzigd op 04/09/2016 15:29:09 door - SanThe -
Ik heb nog even kritisch naar je reactie gekeken en je had gelijk. In mijn config bestand stond de locatie op Nl. Ik heb dit gewijzigd en krijg nu weer een . en daarmee gaat de afronding via sprintf("%01.2f",) ook weer goed.
Ik ben overgegaan op een andere manier van scripting (veiliger). Dat verklaard waarom forms uit mijn oude systeem welke deels nog draait nog wel goed gaan bij afronding
Hartelijk dank voor de tips en reactie op mijn probleempje....OPGELOST