2012-04-20 1 views
1

J'utilise active Enregistrement et mon code de CodeIgniter est:Pourquoi MySQL n'aura-t-il pas les bonnes données?

$current_balance = $this->get_campaign_balance($click_report['campaign_id']); 

    $campaign_ledger = array(
    'campaign_id' => $click_report['campaign_id'], 
    'description' => "Click Deduction from script", 
    'amount'  => -1 * $click_report['advertiser_spend'], 
    'balance'  => "" . $current_balance - $click_report['advertiser_spend'], 
    'meta_data'  => $click_report['day'], 
    'timestamp'  => time() 
); 

    $this->db->insert('campaign_ledger', $campaign_ledger); 

Quand je var_dump le $campaign_ledger je reçois:

array(6) { 
    ["campaign_id"]=> 
    string(3) "277" 
    ["description"]=> 
    string(27) "Click Deduction from script" 
    ["amount"]=> 
    float(-0.05) 
    ["balance"]=> 
    float(89.95) 
    ["meta_data"]=> 
    string(10) "2012-04-19" 
    ["timestamp"]=> 
    int(1334881599) 
} 

Mais quand les données vont dans ma base de données, le balance est 91.36800000000001 pour quelque raison. Alors, quel est le problème?

EDIT

Après avoir changé DECIMAL(10,4), je reçois toujours 91.3680 en sortie.

+0

Quel est le type de données du champ de bilan dans la base de données? –

+0

Qu'espériez-vous obtenir? –

+0

Je l'avais comme FLOAT, j'ai changé pour 'DECIMAL (10,4)' et il est toujours éteint – Shamoon

Répondre

1

Faites attention à stocker des devises comme type "DECIMAL" dans MySQL. Si vous utilisez Float, vous obtiendrez des résultats incohérents. Je sais que vous n'avez pas dit quel type de données vous avez utilisé, mais quelque chose me dit que ce n'est probablement pas DECIMAL (10,2).

+0

Je l'avais comme 'FLOAT' mais changé pour 'DECIMAL (10,4)' et il est toujours éteint – Shamoon

+0

Quand vous dites c'est encore "off" - que stockez-vous et que voyez-vous dans la base de données? Vous devriez faire écho à ce que vous aviez auparavant, puis regarder dans la base de données avec une requête brute ou phpmyadmin. Ensuite, regardez ce que vous obtenez de la base de données. Cela va affiner où la précision impropre arrive. Si vous stockez de l'argent, il suffit de stocker des cents (10,2). Un autre truc que certaines personnes utilisent est de stocker de l'argent sans décimales. Il suffit de multiplier par 100 et stocker comme un grand int. Puis divisez par 100 quand vous voulez traduire en dollars et en cents. –

+0

Édité la question originale. S'il vous plaît voir ci-dessus. Je ne stocke pas d'argent avec une précision standard à 2 chiffres. J'ai besoin de beaucoup plus de granularité. – Shamoon

Questions connexes