2012-04-20 36 views
1

我用笨的活动记录和我的代码是:为什么MySQL不能得到正确的数据?

$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); 

当我var_dump$campaign_ledger我得到:

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) 
} 

但是,当数据进入我的数据库中,balance91.36800000000001为一些原因。那么,有什么关系呢?

编辑

变为DECIMAL(10,4)后,我仍然得到91.3680作为输出。

+0

数据库中的余额字段的数据类型是什么? – 2012-04-20 00:29:51

+0

你期望得到什么? – 2012-04-20 00:31:09

+0

我把它作为FLOAT,我改成了'DECIMAL(10,4)',但它仍然关闭 – Shamoon 2012-04-20 00:47:01

回答

1

请注意在MySQL中将货币存储为类型“DECIMAL”。如果你使用Float,你会得到不一致的结果。我知道你在这里没有说你使用了哪种数据类型,但是有些东西告诉我它可能不是DECIMAL(10,2)。

+0

我把它当作'FLOAT',但改成了'DECIMAL(10,4)',它仍然关闭 – Shamoon 2012-04-20 00:48:25

+0

当你说它是仍然“关闭” - 你在存储什么,你在数据库中看到什么?您应该回应以前的内容,然后使用原始查询或phpmyadmin查看数据库。然后,看看你从数据库中得到什么。这会缩小精度不准确的地方。如果你存钱,只需存储分(10,2)。有些人使用的另一个窍门是存储没有小数的钱。只需乘以100并存储为一个大整数。然后除以100,当你想翻译回美元和美分。 – 2012-04-20 00:56:17

+0

编辑原始问题。请参阅上文。我不是以标准的2位精度存储钱。我需要更多粒度的方式。 – Shamoon 2012-04-20 01:01:51

相关问题