控制MySQLdb中的小数除法精度

1 投票
1 回答
889 浏览
提问于 2025-04-15 17:06

MySQLdb在处理数字时有点奇怪,它总是返回一个小数对象,这个小数的有效数字比除法运算中的分子多出两个。

如果分母比较大,有时候结果会被截断成零,也就是说计算出来的结果可能会变成0:

>>> import MySQLdb
>>> db = MySQLdb.connect(.....)
>>> c = db.cursor();
>>> c.execute("select 1000/ 20990933630")
1L
>>> c.fetchall()
((Decimal("0.0000"),),)
>>> c.execute("select 1000.0000000000000000000000/ 20990933630")
1L
>>> c.fetchall()
((Decimal("4.763961516084313397E-8"),),)
>>> c.execute("select (1000 + 0.000000000000000000000) / 20990933630")
1L
>>> c.fetchall()
((Decimal("4.76396151608431340E-8"),),)

我能强制进行浮点数除法吗?有没有比在每个数字后面加上0.0000000000更优雅的方法呢?

1 个回答

3

你可以修改 div_precision_increment 这个变量。它的默认值是 4。

http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_div_precision_increment

下面是一个使用你提到的除法的例子:

mysql> select 1000/ 20990933630;
+-------------------+
| 1000/ 20990933630 |
+-------------------+
|            0.0000 | 
+-------------------+
1 row in set (0.00 sec)

mysql> set local div_precision_increment = 30;
Query OK, 0 rows affected (0.00 sec)

mysql> select 1000/ 20990933630;
+----------------------------------+
| 1000/ 20990933630                |
+----------------------------------+
| 0.000000047639615160843133969739 | 
+----------------------------------+
1 row in set (0.00 sec)

mysql> 

撰写回答