Meddelande

Minska
No announcement yet.

Antal decimaler for float?

Minska
X
  • Filter
  • Klockan
  • Show
Clear All
new posts

  • Antal decimaler for float?

    Hej!
    Följande funktion konverterar en sträng till float:
    PHP-kod:
    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)+) {
            
    $this->error(_('Kunde inte konvertera till decimal. Tal för långt.'));
            return 
    false;
        }
        
    $amount preg_replace("/(\d*)(\d\d)$/""$1.$2"$amount1);
        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:
    Kod:
    string(18) "000000000000685691"
    Sen blir det problem
    Kod:
    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!

    //Micke Andersson
    Hemsida | Kontakta
    ----------------------
    "Det är svårt att vara ödmjuk när man vet att man är bäst".

  • #2
    Felet är enkelt att återskapa:
    PHP-kod:
    $T 3179.12;
    echo 
    $T."<br />";
    var_dump($T);
    echo 
    "<br />";
    var_export($T); 
    Ger följande:
    Kod:
    3179.12
    float(3179.12)
    3179.1199999999999
    //Micke Andersson
    Hemsida | Kontakta
    ----------------------
    "Det är svårt att vara ödmjuk när man vet att man är bäst".

    Kommentera

    Working...
    X