如何在 SQL 数据库中存储 python 浮点数

问题描述 投票:0回答:4

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

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

python sql floating-point decimal precision
4个回答
7
投票

问题是您的浮点数不是 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
破坏了,甚至在您进入数据库之前。


0
投票

如果你不想/不需要精度,你可以使用

np.round(array,roundto)


0
投票

您必须在 SQL 中定义小数位,例如:

decimal(8,2)


0
投票

对不起,你能告诉我你是如何解决这个问题的吗?我已经阅读了 abarnert 的建议,但我想我已经尝试过这些选项。 这是我的问题的链接 pyodbc insert decimal 将数据类型 nvarchar 转换为 float 时出错

© www.soinside.com 2019 - 2024. All rights reserved.