【问题标题】:how to store python float in SQL database如何将python浮点数存储在SQL数据库中
【发布时间】:2018-09-06 10:14:17
【问题描述】:

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

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

【问题讨论】:

    标签: python sql floating-point decimal precision


    【解决方案1】:

    问题是你的浮点值不是 0.4,因为在 float32float64(或 Python 原生 float,通常与 float64 相同)中没有值0.4。最接近 0.4 的 float64 是 0.400000000000021,这正是您所拥有的。

    由于float 的值与 0.4 最接近,因此如果您要求 Python 将其转换为字符串(例如,print(f)),它会友好地为您提供字符串0.4

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


    那么,你应该怎么做呢?

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

    说真的,如果要使用这个数据库的其他代码只是将值读取为float64,或者将它们读取为字符串并将它们转换为float64(或float32),它们将不管你做什么都以0.400000000000021结尾,所以不要做任何事情。

    另外,请考虑一下:如果0.40.400000000000021 之间的差异会对您的任何代码产生任何影响,那么您的代码已经被使用float64 破坏,甚至在您访问数据库之前.

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我尝试了 python 标准 round() 但没有帮助,因为它返回一个浮点数。我可能错了,但 np.round() 会返回一个 np.float 所以问题仍然存在。我错过了什么吗?
        猜你喜欢
        • 2017-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 2014-03-25
        • 1970-01-01
        相关资源
        最近更新 更多