Python将值<= 1e-7插入MySQL数据库

1 投票
2 回答
546 浏览
提问于 2025-04-18 03:00

我有一个用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

我同意另一个回答中表达的观点,尽量不要把查询字符串和字符串格式化混在一起,如果可以的话,最好避免这样做。

撰写回答