Skip to main content
 首页 » 编程设计

python之如何在 SQL 数据库中存储 python float

2025年05月04日22jiqing9006

在 python3 中,我主要使用 float 或 np.float32/64,当涉及到将其存储到数据库中时,即使 SQL 类型是数字/小数,我们最终也会得到 0.400000000000021 或类似的东西而不是 0.4
如果从另一个应用程序访问此类数据,则可能会出现问题。

仅使用 decimal。python 中的 Decimal 不是我们的答案,因为我们大量使用 pandas,并且不支持 Decimal。
一个解决方案是在插入 SQL 之前将 float 转换为 Decimal(在我们的例子中是 SQL Server,但这是一个细节)。然后在 SELECT 之后从 Decimal 返回到 float。
您有另一种(更好的)方法来处理此类问题吗?

请您参考如下方法:

问题是你的 float 值不是 0.4,因为 float32 或 float64(或 Python 原生 float,通常与 float64) 相同,即 0.4。最接近 0.4 的 float64 是 0.400000000000021,这正是您所得到的。

因为这是最接近 0.4 的 float 值,如果您要求 Python 将其转换为字符串(例如,print(f)),它会友好一点,给你字符串 0.4。

但是当你将它传递给数据库时……嗯,这实际上取决于你使用的是哪个数据库接口(interface)库。对于一些,它会调用 repr,这会给你 '0.4'(至少在 Python 3.x 中),所以你要求数据库存储 float 字符串 '0.4' 的值。但对于其他人,它将直接将浮点值作为 C double 传递,因此您要求数据库存储浮点值 0.400000000000021。


那么,你应该怎么做呢?

  • 您是否希望将此数据库与其他代码一起使用,这些代码会将值作为字符串读取,然后将它们转换为类似 Decimal 或 float80 或 decimal64 的格式 还是其他类型?然后,您几乎肯定想要设置一个 SQL 数据类型,如 DECIMAL(12, 6) 来匹配您的实际精度,并让数据库来处理它。 (毕竟0.4四舍五入到小数点后六位和0.400000000000021四舍五入到小数点后六位没有区别。)
  • 您想在数据库内部进行数学计算吗?同上。
  • 否则呢?什么都不做。

严重的是,如果要使用此数据库的其他代码只是将值读取为 float64,或者将它们读取为字符串并将它们转换为 float64 (或 float32),无论您做什么,它们都将以 0.400000000000021 结束,所以不要做任何事情。

此外,考虑一下:如果 0.4 和 0.400000000000021 之间的差异会对您的任何代码产生任何影响,那么您的代码已经通过使用 float64,甚至在您访问数据库之前。