com*_*mte 1 python sql floating-point precision decimal
在python3中,我主要使用float或np.float32 / 64,当将其存储到数据库中时,即使SQL类型为Numeric / Decimal,我们最终也会得到0.400000000000021或类似的值而不是0.4,
这可能是一个问题这些数据是从另一个应用程序访问的。
仅使用十进制.python中的十进制对我们来说不是答案,因为我们大量利用了熊猫,并且不支持十进制。
一种解决方案是在插入SQL之前将float转换为Decimal(在我们的例子中为SQL Server,但这是一个细节)。然后从十进制返回到SELECT之后的浮点数。
您是否有另一种(更好的方法)来处理此类问题?  
问题是您的float的值不是0.4,因为float32或float64(或Python native float,通常与)相同的值都不是float640.4。最接近float640.4的是0.400000000000021,这正是您所拥有的。
由于这是最接近的float值0.4,因此如果您要求Python将其转换为字符串(例如print(f)),它将很友好并为您提供string 0.4。
但是,当您将其传递给数据库时……好吧,它实际上取决于您所使用的数据库接口库。对于某些对象,它将调用repr,这会给您'0.4'(至少在Python 3.x中),因此您要数据库存储字符串的float值'0.4'。但是与其他人一样,它将直接将float值作为C传递double,因此您要求数据库存储float值0.400000000000021。
那你该怎么办?
Decimalor float80或decimal64or或其他类型的代码一起使用?然后,您几乎可以肯定要设置一个DECIMAL(12, 6)与您的实际精度相匹配的SQL数据类型,然后由数据库来处理。(毕竟,0.4四舍五入到小数点后六位与小数点后六位没有区别0.400000000000021。)认真地说,如果将要使用该数据库的其他代码只是将值读取为float64,或者将它们读取为字符串并将其转换为float64(或float32),那么0.400000000000021无论您做什么,它们最终都将结束,所以请不要什么都不做。
另外,还要考虑这样的:如果之间的差别0.4,并0.400000000000021会作出任何差别的任何代码,那么你的代码已经被使用打破float64,之前,你甚至获取数据库。