为什么赢了';MySQL不能获得正确的数据吗?
我正在使用CodeIgniter的活动记录,我的代码是:为什么赢了';MySQL不能获得正确的数据吗?,mysql,codeigniter,floating-point,double-precision,Mysql,Codeigniter,Floating Point,Double Precision,我正在使用CodeIgniter的活动记录,我的代码是: $current_balance = $this->get_campaign_balance($click_report['campaign_id']); $campaign_ledger = array( 'campaign_id' => $click_report['campaign_id'], 'description' => "Click Deduction from scr
$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\u dump
时,$campaign\u分类账
我得到:
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)
}
但是,当数据进入我的数据库时,由于某种原因,余额是91.368000000001
。那么,这种脱节是怎么回事
编辑
更改为DECIMAL(10,4)
后,我仍然得到91.3680
作为输出。在MySQL中小心地将货币存储为“DECIMAL”类型。如果使用Float,将得到不一致的结果。我知道你在这里没有说你使用的是哪种数据类型,但有些东西告诉我它可能不是十进制(10,2)。数据库中余额字段的数据类型是什么?你希望得到什么?我把它作为浮点,我改成了DECIMAL(10,4)
,它仍然是offI我把它作为FLOAT
但改成了DECIMAL(10,4)
当你说它仍然处于“关闭”状态时,它仍然处于关闭状态-你存储了什么,在数据库中看到了什么?您应该回显之前的内容,然后使用原始查询或phpmyadmin查看数据库。然后,看看你从数据库中得到了什么。这将缩小不适当精度的范围。如果你在存钱,只需存储美分(10,2)。有些人使用的另一个技巧是不带小数的存储货币。只需乘以100并存储为一个大整数。然后,当你想将其转换回美元和美分时,再除以100。编辑原始问题。请看上面。我不是在用标准的2位数精度存储钱。我需要更多的粒度。Shamoon,我真的认为如果你在PHP中使用89.95作为浮点,你可能会使用数字格式(89.95,4),然后将其放入MySQL(即使你不使用数字格式),我真的认为你不会得到91.3680。也许你仍然有旧的价值观?这似乎是一个速度问题,这毫无意义。如果我只插入一个值,这很好,但当我将它放入循环中时,没有骰子。有什么想法吗?