我有一个带浮动值的奇怪的PHP行为
$array_test["test"]= round($value,2); //first I round up a value
echo $array_test["test"]; //0,66
$s_array_test= serialize($array_test); //serializing the array
var_dump($s_array_test) // (...)s:4:"test";d:0.66000000000000003108624468950438313186168670654296875;}(...)
这非常烦人,因为序列化数组存储到db中使用更多空间......
如何解决这个问题?
THX
答案 0 :(得分:3)
首先阅读手册http://php.net/manual/en/language.types.float.php
中有关浮动的部分浮点数的精度有限。虽然它取决于系统,但PHP通常使用IEEE 754双精度格式,由于舍入的顺序为1.11e-16,因此会产生最大的相对误差。非基本算术运算可能会产生更大的误差,当然,当复合多个运算时,必须考虑错误编程。
此外,基本10中的浮点数精确表示的有理数,如0.1或0.7,没有精确表示为基数2中的浮点数,无论尾数的大小如何,它都在内部使用。因此,它们不能在没有很小精度损失的情况下转换为它们的内部二进制对应物。这可能会导致令人困惑的结果:例如,floor((0.1 + 0.7)* 10)通常会返回7而不是预期的8,因为内部表示将类似于7.9999999999999991118 ....
因此,永远不要将浮点数结果信任到最后一位数,并且永远不要将浮点数与相等性进行比较。如果需要更高的精度,可以使用任意精度数学函数和gmp函数。
您可以使用sprintf()
(而非round()
)将浮动转换为固定大小的字符串
sprintf('%.2f', $float);
但我建议您创建并使用真正的数据库架构。如果只是在其中放入非结构化字符串,则根本不需要数据库。您可以使用简单的平面文件。
答案 1 :(得分:1)
它可能表现得像这样,因为表中的数据类型是varchar或任何非数字数据类型。 我不是说这是唯一的原因,但它可以是其中之一..