|
Avrundning
Formatering
Slumptal
Stora tal
1.10.4 Stora tal
Oftast fungerar det bra med vanliga integers och doubles, men ibland
kan det bli problem. Hur räknar man t.ex. 100100000?
Till verkligt stora tal måste man ta till s.k. Binary Coded Decimals
(BCD). I Windows är BCD installerat i standardinstallationen av
PHP, men i t.ex. Linux kanske man måste kompilera PHP med -enable-bcmath
Med hjälp av phpinfo() kan man se om BCD är aktiverat eller
ej.
BCD Math exempel
Alla BCD funktioner i PHP
<?php
# alla bc funktioner har en sista valbar parameter som anger
# antalet decimaler
# om man inte vill ange antal decimaler hela tiden
# kan man sätta defaulten till ett tal och sedan lämna
# bort antalet decimaler
# Nedanstående rad sätter decimalernas antal till 5
bcscale(5);
# bcadd - addition
#----------------------------------------------
# tal1, tal2, antal decimaler
# addera och visa 10 decimaler
echo bcadd("1.433733837338", "19808980889", 10). "<br>";
# samma sak fast med 2 decimaler
echo bcadd("1.433733837338", "198987", 2). "<br>";
# anger man inte antal decimaler används det tal som
# sattes med bcscale funktionen
echo bcadd("1.433733837338", "198987"). "<br>";
# bcsub - subtraktion
#----------------------------------------------
echo bcsub("1.433733837338", "198987"). "<br>";
# bcmul - multiplikation
#----------------------------------------------
echo bcmul("1.433733837338", "198987"). "<br>";
# bcdiv - division
#----------------------------------------------
echo bcdiv("1.433733837338", "198987"). "<br>";
# bcmod - modulus
#----------------------------------------------
echo bcmod("1991280391823091", "2"). "<br>";
# bcpow - power (upphöjt med)
#----------------------------------------------
$res = bcpow("22", "154"). "<br>";
#blir så stor tal att jag måste splitta upp det i flera rader
echo chunk_split($res, 62, "<br>");
# bcsqrt - kvardarroten
#----------------------------------------------
echo bcsqrt("10011231391827391"). "<br>";
# bccomp - jämförelse
#----------------------------------------------
# följande ger 0 (true) efterom siffrorna är lika
# i de 4 första decimalerna
echo bccomp("8.2123123123", "8.2123123188", 4). "<br>";
# följande ger -1 (false) efterom siffrorna är lika
# i de 4 första decimalerna
echo bccomp("8.1123123123", "8.2123123188", 4). "<br>";
# ett till exempel - använder default antal decimaler
echo bccomp("8.1123123123", "8.2123123188"). "<br>";
?>
Listning 1.10.4.1 - samples/s76.php
19808980890.4337338373 198988.43 198988.43373 -198985.56626 285294.39509 0.00000 1 54086994167966954972865232922145915479189167583854556244103944 50062286177465607788773389665555522296686210703323230781078335 88067874482155056238941920533895329772321791417912258762605169 270362741809289887744
100056141.19996 0 -1 -1
Resultat av listning 1.10.4.1
|