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