MySQL浮点数意外地舍入

时间:2016-01-15 16:00:16

标签: php mysql codeigniter codeigniter-3

我不确定它的MySQL是否会切断Codeigniter中的数字或隐藏的配置,这是我正在使用的。

有问题的字段是:

`total` float(12,4) unsigned NOT NULL 

这是数据的插入代码:

$data = array(
    // ...
    'total' => $datos['total'], // value is 577.82999999999
);
$res = $this->db->insert($this->tabla, $data); // Codeigniter DB insertion method

存储此值:

577.8300

不应该是:

577.8299 ??

1 个答案:

答案 0 :(得分:2)

float(12,4)表示您将total值存储为12位数,而其中4位将用于存储小数部分。

这就是577.82999999999成为577.8300的原因。此外,它不会被存储为577.8299,因为每个数字都必须舍入而不是忽略其余数字。

换句话说,想象你有相同的数字,但想要存储它只有2位数的小数部分。如果您忽略其他数字(不进行舍入),您最终会得到577.82。然而,我们的原始数字更接近577.83,因此我们失去了精确度。

更进一步:四舍五入的工作方式

以下算法显示了舍入的工作原理:

Get first digit after limit
if it is equal to or greater than 5
  add 1 to digit at limit
end

因此577.82999999999将变为577.8300,因为1被添加到小数部分的第4位。这个数字是9,导致1的传播,最终会在577.8300