Tein muutaman erillaisen funktion yhtälön ratkaisemiseen. Jos luvut ovat liian isoja, niin vastaus on esimerkiksi jakoyhtälössä:
x : 166676656436 = 3333823423466 x = 3333823423466 * 166676656436 x = 5.5567054137133E+23
Tässä ollaan kyllä jo tosi isoissa luvuissa, mutta olisihan se kiva tietää, mitä tämä E+23 tarkoittaa, ja miten saisin tuon näkymään normaaleina numeroina.
Se tarkoittaa, että lukua ei kannata ilmoittaa normaalissa muodossa, vaan se esitetään ns. 10-potenssina. Jos muoto 5.56 x 1023 on tuttu, niin tuo on vaihtoehtoinen esimuoto (rankasti pyöristettynä). Mikäli tuokaan ei ole tuttu, niin voit ajatella lukua, jossa 5.56 jälkeen on 24 nollaa.
Mod. korjasi listatagin.
Juu, en tajunnut että E olisi potenssilasku. No, nyt viisastuin.
En voinut muokata enään viestiäni, joten kysyn sitten uudella viestillä: Saako PHP:n näyttämään noin suuret luvut?
PHP muuttaa noin isot luvut liukuluvuiksi, ja liukulukujenkin tarkkuudella on rajansa.
Yksi tapa on pitää luvut merkkijonoina ja käyttää BC Math-kirjastoa laskuissa. BC Mathia voit pyytämää laskemaan niin tarkasti kuin haluat, eikä se muuta lukua tuollaiseen lyhennysmuotoon.
Ihan ettei nyt jää väärä käsitys, niin E ei ole potenssilasku, vaan 12.34e56 tarkoittaa 12,34 · 1056. Potenssiin korotetaan siis luku 10 eikä itse näkyvää lukua. Toisin ajateltuna tuo loppuosa kertoo, monenko numeron yli desimaalipilkkua (-pistettä) pitää siirtää. 12.34e1 = 123.4 ja 12.34e-1 = 1.234.
Luvun voi muuttaa tekstiksi sprintf-funktiolla. Kannattaa kuitenkin muistaa, että kokonaisluvun lukualue on rajallinen ja liukuluvut (desimaaliluvut) ovat epätarkkoja, kuten tästäkin esimerkistä näkyy:
<?php $s = sprintf("%f", 1.2345e67); # $s = "12345000000000000280007841501019912947901403997040281993972375617536.000000" ?>
sprintf() ei toiminut minulla, mutta printf toimi (Tulosti tuon vastauksen).
Sitten tuohon map_in vastaukseen: Tuokin toimi hyvin, mutta ongelma on se, että kun käyttäjä syöttää luvun, niin vikaksi paramentiksi pitäisi saada pisteen jälkeiset tiedot luvusta/vastauksesta. Koitin säännöllisillä lausekkeilla laittaa muuttujaan $pituus merkkijonon pisteen jälkeisen tekstin ja laskea sen pituuden strlen() funktiolla - mutta tämä palautta 1, vaikka numeroita oli 8!
split tai explode
Rocceri: Jos edes lukisit esimerkkini ajatuksella tai katsoisit manuaalista, mitä sprintf tekee, voisit tajuta, että sprintf palauttaa sen tekstin ja esimerkissäni se sijoitetaan muuttujaan $s.
Metabolix kirjoitti:
12.34e1 = 1.234 ja 12.34e-1 = 123.4
Näissä ilmeisesti tullut pienoinen näppäilyvirhe? 12.34e1 = 12.34 * 10^1 = 123.4 ja vastaavasti 12.34e-1 = 1.234
Päärynämies kirjoitti:
Näissä ilmeisesti tullut pienoinen näppäilyvirhe?
Niinpä oli.
Aihe on jo aika vanha, joten et voi enää vastata siihen.