webForumDet fria alternativet

Antal decimaler for float?

PHP

1 svar · 143 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Hej!
Följande funktion konverterar en sträng till float:

function str2amount($amount, $allowSignal=true){
    $sign = 1;
    if ( is_string($amount) ) {
        $amount = trim($amount);
        if ( empty($amount) ) return "";
    }
    if ( !is_numeric($amount) ) {

        if ( $allowSignal && preg_match("/^\d+å|[JKLMNOPQR]$/", $amount) ) {
            //Transform to negative amount
            $sign = -1;
            $ptrns = array(
                "/^(\d+)å$/",
                "/^(\d+)J$/",
                "/^(\d+)K$/",
                "/^(\d+)L$/",
                "/^(\d+)M$/",
                "/^(\d+)N$/",
                "/^(\d+)O$/",
                "/^(\d+)P$/",
                "/^(\d+)Q$/",
                "/^(\d+)R$/",
            );
            $replace = array(
                '${1}0',
                '${1}1',
                '${1}2',
                '${1}3',
                '${1}4',
                '${1}5',
                '${1}6',
                '${1}7',
                '${1}8',
                '${1}9',
            );
            $amount =  preg_replace($ptrns, $replace, $amount);

        } else {
            $this->error(_('Ogiltigt belopp, inte ett tal.'));
            return false;
        }
    }
    $amount = ltrim($amount, '0');
    if ( strlen($amount) > strlen((string)PHP_INT_MAX)+1 ) {
        $this->error(_('Kunde inte konvertera till decimal. Tal för långt.'));
        return false;
    }
    $amount = preg_replace("/(\d*)(\d\d)$/", "$1.$2", $amount, 1);
    return floatval($amount)*$sign;
}

Jag läser in tal som strängar i formatet 1234567 och ut kommer ett formaterat tal (float) i formatet 12345.67

Problemet är att i vissa fall läggs 10 decimaler på, och jag förstår inte varför.

Jag skickar in följande till funktionen:

string(18) "000000000000685691"

Sen blir det problem

var_dump: float(6856.91)
var_export: 6856.9099999999999

Iom det här blir en beräkning helt fel. Har ingen aning om hur jag ska få rätt på antal decimaler, något som vet?

Tack!

Medlem sedan feb. 20034 441 inlägg
#2

Felet är enkelt att återskapa:

$T = 3179.12;
echo $T."<br />";
var_dump($T);
echo "<br />";
var_export($T);

Ger följande:

3179.12
float(3179.12)
3179.1199999999999
263 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)