Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP muuttujan arvon tsekkaus

Sivun loppuun

mrkebab [04.03.2009 09:44:34]

#

Terve.

Minulla on ongelma lukujen kanssa:

Saan tietokannasta seuraavanlaisia arvoja:

90.423
90.310
90.002
90.000
100.000
89.211

Eli lukuja, joilla on kolme decimaalia.

Miten saisin decimaalit pois luvuista, jotka ovat 'kokonaislukuja'
Eli yo. arvoista 100.000 ja 90.000

Eli kun luku on tasan, niin käyttäjälle näytettäisiin vain 90 tai 100
Miten saa tasaluvuista decimaalit pois ?

Onko PHP:ssa olemassa jotain valmista funktiota tähän ?

tkok [04.03.2009 09:47:22]

#

Toimisko näin?

if($luku == (int)$luku) { $luku = (int)$luku; }

Tai sitten jos kokeillaan ykkösellä jaon tasan menoa:

if($luku % 1 == 0) { $luku = (int)$luku; }

mrkebab [04.03.2009 11:41:09]

#

Kiitos tkok.

Ensimmäinen tapa toimii.

Jälkimmäinen tapa ei enää näytä decimaalilukuja oikein,
vaan näyttää ne kokonaislukuina.

tkok [04.03.2009 12:08:43]

#

mrkebab kirjoitti:

Kiitos tkok.

Ensimmäinen tapa toimii.

Jälkimmäinen tapa ei enää näytä decimaalilukuja oikein,
vaan näyttää ne kokonaislukuina.

Aivan, pitäisi varmaan olla toi if-lause jotain tälläistä:

$luku % 1 == 0.000

Mut hyvä että toimi, olen tässä just aloitellu php-koodausta. kirjasta viidesosa luettu.

mrkebab [04.03.2009 13:53:24]

#

Nyt tuli vielä kinkkisempi kysymys mieleen:

Jos minulla on luku 99.9999, niin miten/millä saisin siitä
luvun 99.999
tai 99.99
tai 99.9 ?

jos käytän roundia, niin se automaattisesti pyöristää lukua jossain vaiheessa.

haluan, että luvut pysyvät täsmälleen tarkassa arvossa, mutta siitä voitaisiin poistaa yksi tai useampi decimaali ?

tkok [04.03.2009 14:00:10]

#

mrkebab kirjoitti:

Nyt tuli vielä kinkkisempi kysymys mieleen:

Jos minulla on luku 99.9999, niin miten/millä saisin siitä
luvun 99.999
tai 99.99
tai 99.9 ?

jos käytän roundia, niin se automaattisesti pyöristää lukua jossain vaiheessa.

haluan, että luvut pysyvät täsmälleen tarkassa arvossa, mutta siitä voitaisiin poistaa yksi tai useampi decimaali ?

Toimisko:

printf("%01.3f", $luku);
printf("%01.2f", $luku);
printf("%01.1f", $luku);

GimPeltzi [04.03.2009 14:02:50]

#

mrkebab kirjoitti:

Nyt tuli vielä kinkkisempi kysymys mieleen:

Jos minulla on luku 99.9999, niin miten/millä saisin siitä
luvun 99.999
tai 99.99
tai 99.9 ?

jos käytän roundia, niin se automaattisesti pyöristää lukua jossain vaiheessa.

haluan, että luvut pysyvät täsmälleen tarkassa arvossa, mutta siitä voitaisiin poistaa yksi tai useampi decimaali ?

Mikä siinä on ongelma? 99,999 on lähempänä lukua 100 kuin lukua 99,9, joten se on matemaattisesti järkevämpi vaihtoehto.

Jos tuo kuitenkin nyt täytyy tehdä, niin varmaankin täytyy turvautua merkkijonofunktioihin, joiden avulla vain pätkästään pois viimeiset merkit.

tkok [04.03.2009 14:09:21]

#

myös tämä purkka katkaisee, eikä pyöristä:

//Tuhannesosakatkaisu
$luku=(int)($luku*1000);
$luku=(float)($luku/1000);

//sadasosakataisu
$luku=(int)($luku*100);
$luku=(float)($luku/100);

//kymmenesosakatkaisu
$luku=(int)($luku*10);
$luku=(float)($luku/10);

//ehkä toimii myös näin
$luku=(float)(((int)($luku*100))/100);

TeNDoLLA [04.03.2009 15:55:41]

#

PHP:ssa on myös valmis funktio: https://www.php.net/manual/en/function.number-format.php , jolla luvusta saa formatoitua desimaalien määrän + muutakin.

EDIT: Jahs.. pikasella testauksella tuokin näyttää pyöristävän luvun 99.9999 => 100.0000. Eli ilmeisesti tuohon sitten pitää tehdä se oma purkka.

EDIT2: Myös noilla stringi funktioilla sais desimaalit määrättyä esim. näin

<?php
$desimaalit = 3; // Tätä vaihtamalla saa desimaalien määrän.
$luku = 99.989999999;
$temp = explode('.', $luku);
$kokonaisosa = $temp[0];
$desimaaliosa = $temp[1];
$desimaaliosa = substr($desimaaliosa, 0, $desimaalit);
$luku = floatval($kokonaisosa . '.' . $desimaaliosa);
var_dump($luku); // float(99.989)
?>

mrkebab [04.03.2009 16:19:14]

#

Kiitos paljon tkok ja TeNDoLLA !

Nyt toimii hyvin

GimPeltzi [04.03.2009 17:10:43]

#

Mua kyl kiinnostais miks tahdot katkasta lukuja keskeltä poikki.

Grez [04.03.2009 23:39:34]

#

Floorilla voisi varmaan myös pyöristää alaspäin.

Hugo [05.03.2009 13:00:33]

#

Tulipa väännettyä omakin versio tästä, älkää kysykö, miksi.

<?php
function get_number($num, $to_int, $round_prec) {
	return (int)$num - $num == 0 ? ($to_int ? (int)$num : $num) : round($num, $round_prec);
}

$luku = 9.00141; // Saatava luku
$to_int = true; // Halutaanko tasaluvut pyöristää int-arvoihin (desimaalit häviää)
$round_prec = 3; // Kuinka monta desimaalia

// Haluttu käännös
$wanted = get_number($luku, $to_int, $round_prec);
// Luvun tarkistus (int vai ei) ja tulostus halutulla tarkkuudella.
printf(is_int($wanted) ? "%d" : "%01.${round_prec}f", $wanted);
?>

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta