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 ?
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; }
Kiitos tkok.
Ensimmäinen tapa toimii.
Jälkimmäinen tapa ei enää näytä decimaalilukuja oikein,
vaan näyttää ne kokonaislukuina.
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.
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 ?
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);
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.
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);
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) ?>
Kiitos paljon tkok ja TeNDoLLA !
Nyt toimii hyvin
Mua kyl kiinnostais miks tahdot katkasta lukuja keskeltä poikki.
Floorilla voisi varmaan myös pyöristää alaspäin.
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); ?>
Aihe on jo aika vanha, joten et voi enää vastata siihen.