MySQL 浮点数被意外舍入

MySQL floating point numbers being unexpectedly rounded

我不确定是 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??

float(12,4) 表示您将使用 12 位数字存储 total 值,而其中 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,因为小数点后第4位加了1。该 digi 是 9,它会导致 1 的传播,最终会出现在 577.8300