在python3中,我主要使用float或np.float32/64,当涉及到将它存储到数据库中时,即使SQL类型是Numeric/Decimal,我们最终也会得到0.400000000000021或类似的东西而不是0.4
如果这些数据是从另一个应用程序访问的。
在python中只使用decimal.Decimal对我们来说不是一个答案,因为我们大量使用pandas,并且不支持Decimal。
一个解决方案是在插入 SQL 之前将 float 转换为 Decimal(在我们的例子中是 SQL Server,但它是一个细节)。然后从 Decimal 返回到 SELECT 之后的浮动。
你有另一种(更好的)方法来处理这样的问题吗?
问题是浮点数的值不是 0.4,因为float32
or float64
(或 Python native float
,通常与 相同float64
)中没有 0.4 的值。最接近float64
0.4 的是 0.400000000000021,这正是您所得到的。
由于这是最接近float
0.4 的值,如果您要求 Python 将其转换为字符串(例如,print(f)
),它会很友好并为您提供字符串0.4
。
但是当你把它传递给一个数据库时……嗯,这实际上取决于你使用的是哪个数据库接口库。对于一些,它会调用repr
,这会给你'0.4'
(至少在 Python 3.x 中),所以你要求数据库存储 string 的浮点值'0.4'
。但是对于其他人,它会将浮点值直接作为 C 传递double
,因此您要求数据库存储浮点值0.400000000000021
。
那你该怎么办?
Decimal
orfloat80
或decimal64
其他类型的内容?那么您几乎肯定希望设置一个DECIMAL(12, 6)
与您的实际精度相匹配的 SQL 数据类型,并让数据库来处理它。(毕竟,0.4
四舍五入到小数点后 6 位和0.400000000000021
四舍五入到小数点后6 位之间没有区别。)说真的,如果要使用此数据库的其他代码只是将值读取为float64
,或者将它们读取为字符串并将它们转换为float64
(或float32
),那么0.400000000000021
无论您做什么,它们最终都会得到结果,所以不要做任何事。
另外,还要考虑这样的:如果之间的差别0.4
,并0.400000000000021
会作出任何差别的任何代码,那么你的代码已经被使用打破float64
,之前,你甚至获取数据库。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句