Python将值<= 1e-7插入MySQL数据库
我有一个用Python(2.7)写的函数,它会对MySQL数据库中的一个双精度值进行更新。当数字大于1e-7时,一切都正常,但如果数字等于或小于这个值,它就会把字段更新为0。
为了弄清楚发生了什么,我在代码中加了一些打印语句,输出了qry
(执行的查询)和value
(要插入的值)。
qry = 'UPDATE %s SET value_dbl = %f WHERE name = \'%s\' && board_id = %d' % \
(self._getValueTableName(idx), value, valueName, self.boardInfo[boardName])
print value
print qry
当我使用值1e-6时,输出如下:
UPDATE temp_ctrl_1 SET value_dbl = 0.000001 WHERE name = 'pid_ki' && board_id = 9
9.99999974738e-06
可以看到,这种情况下一切正常。但是如果我使用值1e-7的话:
UPDATE temp_ctrl_1 SET value_dbl = 0.000000 WHERE name = 'pid_kp' && board_id = 9
9.99999997475e-07
在构建查询字符串时,变量value
被四舍五入成了0。我该如何用小于或等于1e-7的值更新MySQL的双精度字段呢?
2 个回答
2
不要自己去格式化字符串
- 这样会让你的程序容易受到攻击
- 浮点数被格式化成字符串,这样会导致你丢失一些数据
相反,应该把字符串和对象列表作为两个单独的参数传递:
cursor.execute('UPDATE %s SET value_dbl = %f WHERE name = %s && board_id = %d',
[self._getValueTableName(idx), value, valueName, self.boardInfo[boardName]])
1
你可以用科学计数法来插入DOUBLE
类型的数字,所以你只需要把%f
改成%s
,这样就能得到Python对这个值的字符串表示,而不是试图把它四舍五入成浮点数。
>>> value = 1e-7
>>> print value
1e-07
>>> print '%f' % (value)
0.000000
>>> print '%s' % (value)
1e-07
我同意另一个回答中表达的观点,尽量不要把查询字符串和字符串格式化混在一起,如果可以的话,最好避免这样做。