带有浮点数的SQL UPDATE和SET

时间:2012-01-09 17:30:03

标签: sql mysqli

我的数据库中的字段半径为float类型,值为0.0。

通过PHP sript,我把它的值改为d2的内容​​,用这个语句,改为32.422:

$res=mysql_query("UPDATE `astros` SET `radius` = `radius` + ".$d2." WHERE `index` = '".$index."'");

如果以后我使用另一个PHP脚本来减少相同数量的半径值:

$res=mysql_query("UPDATE `astros` SET `radius` = `radius` - ".$d2." WHERE `index` = '".$index."'");

最终值不是0,应该是,但是1.4988E-9 ......几乎为零。

谁能告诉我我做错了什么?

谢谢, Direz

2 个答案:

答案 0 :(得分:1)

没有错,你只是看到了浮点数的限制。

您认为确切的值32.422并非如此。当从查询中的文本表示转换为数据库使用的浮点数时,它将成为使用该数据类型表示的最接近的数字。它可能像32.421999995662,非常接近32.422但不完全正确。

每个浮点值可能包含与您想要的值的偏差,当您使用它们进行计算时,偏差会相加,稍后您会看到差异。

通常情况下,小差异是不可见的,因为当您显示数字时,数字会四舍五入到合理的位数。例如,如果您在第二个查询中减去31.422,则最终会得到非常接近1的值,例如1.00000000014988,当您显示它时将舍入为1.000000000。当你得到一个接近于零的值时,没有比它可以舍入到的偏差大得多的值,所以你只能看到偏差。

答案 1 :(得分:0)

SQL在FLOAT和DOUBLE类型中存在有效数字问题。尝试切换到带有3位有效数字的DECIMAL类型。

DECIMAL类型:http://dev.mysql.com/doc/refman/5.0/en/precision-math-decimal-changes.html 舍入误差示例:http://sqlanywhere.blogspot.com/2011/01/be-very-afraid-of-floating-point.html