Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL更新并使用浮点数进行设置_Sql_Mysqli - Fatal编程技术网

SQL更新并使用浮点数进行设置

SQL更新并使用浮点数进行设置,sql,mysqli,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`

我的数据库中有一个字段半径,类型为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

没什么错,你只是在接受浮点数的限制

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

每个浮点值都可能包含与预期值的偏差,当您使用它们进行计算时,偏差会累积起来,过一段时间后,您会看到差异


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

SQL在浮点和双精度类型中存在有效数字问题。尝试切换到具有3个有效数字的十进制类型

十进制类型:
舍入错误示例:

您最好使用
double
而不是
float
。感谢您的精彩解释!