我正在处理一些就地显示的格式化用户存储的浮点数的就地代码。Python格式字符串和浮点表示法
当前实现做到这一点:
"{0:.24f}".format(some_floating_point).rstrip('0')
这是有道理的和工作得很好大部分。但是当遇到像0.0003
这样的价值时,情况就不一样了。
>>> "{0:.24f}".format(0.0003).rstrip('0')
'0.000299999999999999973719'
一些进一步的调查表明,Python似乎根据请求的位数改变了底层表示法?
>>> "{0:.15f}".format(0.0003)
'0.000300000000000'
>>> "{0:.20f}".format(0.0003)
'0.00029999999999999997'
我的假设是单精度vs双精度。
用户输入这些值作为double值存储在数据库中,并且稍后再次呈现表单时,相同的值将在字段中预先填充。因此我需要这些表示的1:1映射。
因此,我的问题是:什么是处理这种行为的优雅,更重要的安全方法?迄今为止我所做的最大努力都涉及到log10,并且不太理想地把它放在很好的位置。
编辑:由于Prune指出价值并没有真正改变,而是由格式完成的舍入将继续导致一组9个变为0(德)。这种行为是有道理的,但解决方案仍在逃避我。
没有一个优雅的解决这一点,它在基地2座10我可以提供答案之间的差别所固有的,但它也需要日志10 - 你需要限制的位数格式要比存储在double中的有效数字少一个。 –