CAST'inimas, realiųjų skaičių palyginimo problemos sprendimas, bei CAST'inimas
Parašė ozzWANTED 2010 sausio 20 10:01:07
Trumpas kodas:

[code]<?php
$i=1; $bal = 7.8;
$moketi = 1.5;
$m2 = 1.5*5.2;
print("<br /><i>".$i++.".</i> "); echo $m2." VS ".round($m2,2);
print("<br /><i>".$i++.".</i> "); echo ($moketi*5.2 > $bal) ? "true" : "false";
print("<br /><i>".$i++.".</i> "); echo ($m2 > $bal) ? "true" : "false";
print("<br /><i>".$i++.".</i> "); echo ((int)$m2 > (int)$bal) ? "true" : "false";
$m2= round($m2,2);
print("<br /><i>".$i++.".</i> "); echo ($m2 > $bal) ? "true" : "false";
?>[/code]

Kaip manote kokius atsakymus(TRUE ar FALSE) gražins sistema 4 kartus lygindama skaičius: [b]7.8 > 7.8 [/b] ?
Jeigu manote kad visus kartus atsakymas bus"[b]false[/b]", [color=red][b]JŪS KLYSTATE[/b][/color]:

Štai ką gražina output'as:
[code][i]1.[/i] 7.8 VS 7.8
[i]2.[/i] [color=red][b]true[/b][/color]
[i]3.[/i] [color=red][b]true[/b][/color]
[i]4.[/i] false
[i]5.[/i] false[/code]

Atkreipkime dėmesį, kad netgi perCAST'inimas į slankaus kablelio skaičius(real'ieji skaičiai).

Dar vienas pavyzdys:
[code]floor((0.1+0.7)*10);[/code]

Kaip atsakymą gražins skaičių [b][color=red]7 ![/color][/b]
Nors matematiškai turėtų būti [b]8[/b].

Kadangi realieji slankaus kablelio skaičiai yra kompiuterijoje traktuojami kaip eilutės skleidinys. Pvz. tokiu būdu kompiuteris gali gražinti skaičiaus pi apytikslę reikšmę - ji skleidžią skaičių Teiloro eilute iki tam tikro tikslumo(t.y. [b]VISADA[/b] egzistuoja paklaida).

Taigi, naudojanti slankaus kablelio skaičius BŪTINA žinoti, kad VISADA egzistuoja paklaida, ir [color=red][b]PASKUTINIU skaičiumi[/b] [u]pasitikėti nereikėtų[/u].[/color]

Prie to paties, kas galbūt nežino kas yra CAST'inimas, Slankaus kabelio skaičiai(angl. [i]floating-point numbers[/i]), šiek tiek informacijos:

Pagal nutylėjimą "String'ai" matematiniuose veiksmuose yra traktuojami kaip:
a) [b](integer) [/b]tipo skaičiai, jeigu string eilutėje nėra '.', 'e' arba 'E' simbolių;
b) [b](float)[/b] skaičiai, prišingu atveju.

[color=brown][big]Visi galimi kintamųjų/skaičių perdengimai([i]CAST'ing[/i]) PHP kalboje:[/big][/color]
[code](int), (integer) - cast to integer
(bool), (boolean) - cast to boolean
(float), (double), (real) - cast to float
(string) - cast to string
(binary) - cast to binary string (PHP 5.2.1 PHP 6)
(array) - cast to array
(object) - cast to object
(unset) - cast to NULL (PHP 5) [/code]

[big][color=brown]MySQL duomenų tipų castinimas:[/color][/big]
Prie to paties pridėsiu - jeigu norite CAST'inti duomenų tipus MySQL užklausose(nors apskritai CAST'inimas panašus SQL2 standartų kaip ir daugelyje kitų DBVS - MSSQL, Oracle, IBM DB2, Postgre SQL), tai jis vykdomas taip:

[u]Užklausoje galima būtų daryti taip:[/u]
[code][i]mysql > [/i]SELECT 91.2 AS tiksli_apimtis,
CAST(91.2 AS [i][b]UNSIGNED INTEGER[/b][/i]) AS apytiksle_apimtis,
'K.I.S.S.' AS pilna_biografija,
CAST('K.I.S.S.' AS [i][b]BINARY[/b][/i]) AS dvejetaine_biografija,
CAST('K.I.S.S.' AS [b][i]CHAR(2)[/i][/b]) AS apytiksle_apimtis;[/code]

[u]Užklausos rezultatas būtų:[/u][code]tiksli_apimtis apytiksle_apimtis pilna_biografija dvejetaine_biografija apytiksle_apimtis
----------------------------------------------------------------------------------------------------------------
91.2 91 K.I.S.S. K.I.S.S. K. [/code]

[color=brown][big]Visi galimi MYSQL CAST'inimo būdai([i]MySQL 5.0+[/i]):[/big][/color]
[b]BINARY[[/b][i](N)[/i][b]] [/b]- į dvejetainį formatą([i]pre-direktyva skirta kompiliatoriui[/i])
[b]CHAR[[/b][i](N)[/i][b]][/b] - į simbolių formatą.
[b]DATE[/b] - į datos formatą ([i]YYYY-MM-DD[/i])
[b]DATETIME[/b] - į ilgąjį datos formatą ([i]YYYY-MM-DD HH:II:SS[/i])
[b]DECIMAL[[/b][i](M[,D])[/i][b]][/b] - į dešimtainį formatą
[b]SIGNED [[/b][i]INTEGER[/i][b]][/b] - į skaičių aibę ([i]-INF ---> +INF[/i])
[b]TIME[/b] - į laiko formatą([i]HH:II:SS / HHH:II:SS (ilgasis laikas)[/i])
[b]UNSIGNED [[/b][i]INTEGER[/i][b]][/b] - į teigiamų skaičių aibę ([i] >= 0[/i])

[b][color=blue]Pastaba: [/color][/b][i][b][] [/b][/i]- žymi kad parametras neprivalomas. [] simbolių rašyti [u]NEREIKIA[/u]

[hr]
Taip pat keletas nuorodų, norintiems pasiskaityti plačiau:
[i]Duomenų tipų perliejimas(CASTing) [u]MySQL[/u]:[/i]
http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html

[i]Duomenų tipų perliejimas(CASTing) [u]PHP[/u]:[/i]
http://lt.php.net/manual/en/language.types.type-juggling.php

[i]Slankaus kablelio skaičiai:[/i]
http://php.net/manual/en/language.types.float.php

[color=green][b]PhpFusion-Lt.com © 2010 ozzWANTED[/b][/color]