代码之家  ›  专栏  ›  技术社区  ›  comte

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

  •  2
  • comte  · 技术社区  · 6 年前

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

    仅使用十进制。python中的Decimal并不是我们的答案,因为我们大量使用pandas,Decimal不受支持。
    一种解决方案是在插入SQL之前将浮点转换为十进制(在我们的例子中是SQL Server,但这只是一个细节)。然后在选择后从十进制返回到浮点。
    你有没有其他更好的方法来处理这样的问题?

    3 回复  |  直到 6 年前
        1
  •  6
  •   abarnert    6 年前

    问题是您的浮点值不是0.4,因为这两个值中都没有值 float32 float64 (或Python本机) float ,通常与 浮动64 )这是0.4。最近的 浮动64 到0.4,也就是0.400000000000021,这正是你得到的。

    因为那是最近的 浮动 如果要求Python将其转换为字符串(例如。, print(f) ),它会很友好,给你绳子 0.4

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


    那么,你应该怎么做?

    • 是否要将此数据库与其他代码一起使用,这些代码将以字符串形式读取值,然后将其转换为 Decimal float80 decimal64 还是其他类型的?然后,您几乎可以确定要设置一个SQL数据类型,如 DECIMAL(12, 6) 这与您的实际精度相匹配,并由数据库处理。(毕竟 0.4 四舍五入至小数点后6位 0.400000000000021 四舍五入到小数点后6位。)
    • 您想在数据库本身内部进行数学运算吗?同上。
    • 否则什么都不做。

    说真的,如果要使用此数据库的其他代码只是将值读取为 浮动64 ,或将其作为字符串读取并将其转换为 浮动64 (或 浮动32 ),他们最终会 0.400000000000021 不管你做什么,所以什么都不要做。

    此外,请考虑以下问题:如果 0.4 0.400000000000021 将对您的任何代码产生任何影响,那么您的代码已经通过使用 浮动64 ,甚至在您访问数据库之前。

        2
  •  0
  •   krflol    6 年前

    如果你不想/不需要精度,你可以使用 np.round(array,roundto)

        3
  •  0
  •   Daniel    6 年前

    您必须在SQL中定义小数点,例如: decimal(8,2)