在 python3 中,我主要使用 float 或 np.float32/64,当将其存储到数据库中时,即使 SQL 类型是数字/小数,我们最终也会得到 0.400000000000021 或类似的东西,而不是 0.4
如果从另一个应用程序访问此类数据可能会出现问题。
只使用十进制。python 中的十进制不是我们的答案,因为我们大量使用 pandas,并且不支持十进制。
一个解决方案是在插入 SQL 之前将 float 转换为 Decimal(在我们的例子中是 SQL Server,但这是一个细节)。然后在 SELECT 之后从 Decimal 返回到 float。
您有另一种(更好的)方法来处理此类问题吗?
问题是您的浮点数不是 0.4,因为
float32
或 float64
(或 Python 原生 float
,通常与 float64
相同)都没有 0.4 的值。最接近 0.4 的 float64
是 0.400000000000021,这正是您所拥有的。
因为这是最接近 0.4 的
float
值,如果您要求 Python 将其转换为字符串(例如,print(f)
),它会很友好地为您提供字符串 0.4
.
但是当你将它传递给数据库时……嗯,这实际上取决于你使用的是哪个数据库接口库。对于一些,它会调用
repr
,这会给你 '0.4'
(至少在 Python 3.x 中),所以你要求数据库存储字符串 '0.4'
的浮点值。但是对于其他人,它将直接将浮点值作为 C double
传递,因此您要求数据库存储浮点值0.400000000000021
.
那么,你该怎么办?
Decimal
或 float80
或 decimal64
或其他类型的东西吗?那么你几乎肯定想要设置一个像DECIMAL(12, 6)
这样的SQL数据类型来匹配你的实际精度,并让数据库来处理它。 (毕竟0.4
四舍五入到小数点后六位和0.400000000000021
四舍五入到小数点后六位没有区别)说真的,如果要使用这个数据库的其他代码只是将值读取为
float64
,或者将它们读取为字符串并将它们转换为float64
(或float32
),它们将结束与0.400000000000021
无论你做什么,所以不要做任何事情。
此外,考虑一下:如果
0.4
和 0.400000000000021
之间的差异会对您的任何代码产生任何影响,那么您的代码已经被使用 float64
破坏了,甚至在您进入数据库之前。
如果你不想/不需要精度,你可以使用
np.round(array,roundto)
您必须在 SQL 中定义小数位,例如:
decimal(8,2)
对不起,你能告诉我你是如何解决这个问题的吗?我已经阅读了 abarnert 的建议,但我想我已经尝试过这些选项。 这是我的问题的链接 pyodbc insert decimal 将数据类型 nvarchar 转换为 float 时出错