Variable må højst være 5

Tags:    phpdocumentor

<< < 12 > >>
Jeg sad med min kode til et ratingsystem hvor man kan stemme med et tal som skal være 1, 2, 3, 4 eller 5 og ikke højere eller lavere.

Men hvad sker der så lige her hvor jeg har et array kun med tal der alle er over 5... undtaget det sidste.
Fold kodeboks ind/udPHP kode 

Jeg får dette resultat.
Fold kodeboks ind/udKode 

Det må jo være noget med floating point som jeg ikke forstår så meget af. Men det er jo lidt et problem hvis man regner med at 5 er det højeste tal der må kommer ind også går 5.0000000000000001 igennem alligevel.

Hvad går i andre for at undgå sådan noget ?
Man kunne måske bruge is_int() men hvis nu dataen kommer fra en hjemmeside formular så er det altid en streng har jeg læst.



Indlæg senest redigeret d. 24.01.2013 04:50 af Bruger #13010
11 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 15 karma
Sorter efter stemmer Sorter efter dato
Floating point er en svær størrelse. Computeren kan ikke repræsentere tal korrekt (det kan vi heller ikke for den sags skyld...skriv resultatet af 1/3...det kan du ikke).
Der er en grænse for, hvor mange decimaler, du kan tage med, men der er også tal, som er lette at repræsentere decimalt, men som ikke kan repræsenteres binært.

Tag f.eks. dette:
Fold kodeboks ind/udPHP kode 


Hvad skriver dette ud?
0.1 + 0.7 er 0.8.
0.8 * 10 er 8.

Men 0.1 og 0.7 er ikke helt så nemme at repræsentere binært, så de er lidt under og 0.1 + 0.7 bliver derfor 0.7999999999999999 (eller noget i den retning).

Så når man runder ned (som floor() funktionen gør), så får man resultatet 7....som også er hvad der bliver skrevet ud i ovenstående kode.



Hvorfor checke decimaltals værdier, når brugerinput kun kan være heltals værdier? Brugeren skal vel kun præsenteres for valg mellem heltal, og derpå skal server validere og afvise decimaltal?



Du er løbet ind i begrænsningerne for PHP og PHP's float værdi.



Men hvordan valider man så et tal som for eksempel bliver indtastet af en bruger og sendt i en formular ?

Hvordan sikre man sig at tallet højst er 5 ?



Du tjekker om det NÆSTEN er fem.

Fold kodeboks ind/udPHP kode 


Mit eksempel kunne testes således:
Fold kodeboks ind/udPHP kode 




Indlæg senest redigeret d. 24.01.2013 14:16 af Bruger #2695
Ja det skal kun være tilladt at indtage heltal.

Men så prøvede jeg med 5.000000000000000000000000001 cirka og fandt ud af at det virkede selvom det ikke skal.



Indlæg senest redigeret d. 25.01.2013 02:34 af Bruger #13010
Så valider om tallet er et decimaltal? Da brugerinput kommer som tekststreng, kan du jo validere om tallet indeholder punktum eller komma.

Men at sikre sig mod 5.000000000000000000000000001, som invalid input fordi du kun vil have et absolut 5, er måske lidt i overkanten. :)

Enten afvis decimaltal, eller typekast decimaltal til heltal. Det andet er unødigt arbejde. Konvertere PHP til en forkert værdi, finder brugeren jo nok ud af det, når du fortæller at den indtaste værdi ikke er valid. :)



Hvis der kun forventes heltal, kan du type caste til heltal, så du tvinger værdien til at være heltal frem for decimaltal. Hvad bruger du tallet til bagefter? Putter du det i en database hvor felttypen er heltal?



Ja det skal være heltal hele tiden og ja putter det i en databse hvor feltet eller hvad det hedder er int.

Skal man så bare skrive $a = (int) $a; for at lave om til heltal ?



<< < 12 > >>
t