保存到DB的值不正确

时间:2014-08-09 10:02:22

标签: mysql zend-framework floating-point

嗨,我有一个简单的问题。我只是乘以两个数字:

143.778 * 17 = 2444.226

当我做对象时:

$row = $this->createRow();
$row->price = 143.778 * 17;

没关系,但是当我保存时,

$row->save();
数据库中的

将存储 2444.226074 。这是mysql中浮点数的一些已知错误,或浮点数末尾会出现“074”?

2 个答案:

答案 0 :(得分:2)

是的,这似乎是一个浮点错误,因为浮点数很可能是十进制数的近似值。将它们视为精确数字是一个常见的错误。随着在浮子上使用更多的算术运算(将结果重新计算为等式),浮点精度变得越来越明显。你永远不应该直接比较浮动值。

以下是MySQL的更多信息

http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html

尝试使用他们建议的DECIMAL列。

  

DECIMAL和NUMERIC类型存储精确的数值数据值。在保持精确精度很重要时使用这些类型,例如使用货币数据。在MySQL中,NUMERIC实现为DECIMAL,因此以下关于DECIMAL的评论同样适用于NUMERIC。

     

从MySQL 5.0.3开始,DECIMAL值以二进制格式存储。以前,它们存储为字符串,每个数字使用一个字符,小数点(如果比例大于0),“ - ”符号(负数)。请参见第12.17节“精确数学”。

答案 1 :(得分:2)

尝试使用DECIMAL代替Float数据类型更改列

ALTER TABLE a MODIFY price DECIMAL(11,6);

Reference1Reference2