为什么赢了';MySQL不能获得正确的数据吗?

为什么赢了';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

我正在使用CodeIgniter的活动记录,我的代码是:

  $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。也许你仍然有旧的价值观?这似乎是一个速度问题,这毫无意义。如果我只插入一个值,这很好,但当我将它放入循环中时,没有骰子。有什么想法吗?