jlo*_*ert 26 python floating-point excel xlrd
我正在维护一个Python脚本,用于xlrd
从Excel电子表格中检索值,然后使用它们执行各种操作.电子表格中的某些单元格是高精度数字,它们必须保持不变.当检索其中一个单元格的值时,xlrd
给我一个float
如0.38288746115497402.
但是,我需要在代码中稍后将此值转换为字符串.做任何一个str(value)
或unicode(value)
将返回类似"0.382887461155"的内容.要求说这是不可接受的; 精度需要保持.
到目前为止,我已经尝试了几件事,但没有成功.第一个是使用字符串格式化的东西:
data = "%.40s" % (value)
data2 = "%.40r" % (value)
Run Code Online (Sandbox Code Playgroud)
但两者都产生相同的舍入数,"0.382887461155".
在SO和其他地方搜索有类似问题的人时,一个常见的建议是使用该Decimal
课程.但是我不能改变数据给我的方式(除非有人知道xlrd
返回Decimals 的秘密方法).当我尝试这样做时:
data = Decimal(value)
Run Code Online (Sandbox Code Playgroud)
我得到了TypeError: Cannot convert float to Decimal. First convert the float to a string.
但显然我无法将其转换为字符串,否则我将失去精度.
所以,是的,我愿意接受任何建议 - 如果有必要的话,甚至是非常粗暴/粗暴的建议.我对Python(我自己更多的是Java/C#家伙)并不是非常有经验,所以如果我在这里遇到某种基本的误解,请随时纠正我.
编辑:我想我会补充说我使用的是Python 2.6.4.我认为没有任何正式要求阻止我改变版本; 它只是不必弄乱任何其他代码.
Joh*_*hin 50
我是xlrd的作者.在评论中反驳的其他答案和评论中存在很多混淆,所以我在答案中这样做.
@katriealex:""精确在xlrd的胆量中丢失""" - 完全没有根据和不真实.xlrd完全再现了存储在XLS文件中的64位浮点数.
@katriealex:"""有可能修改你的本地xlrd安装来改变浮动投射""" - 我不知道你为什么要这样做; 浮动一个16位整数,你不会失去任何精度!在任何情况下,只有在读取Excel 2.X文件(具有INTEGER类型的单元格记录)时才使用该代码.OP没有表明他正在阅读这些古老的文件.
@jloubert:你一定是弄错了."%.40r" % a_float
只是一种获得相同答案的巴洛克式方式repr(a_float)
.
@EVERYBODY:您不需要将float转换为小数以保持精度.该repr()
功能的重点是保证以下内容:
float(repr(a_float)) == a_float
Run Code Online (Sandbox Code Playgroud)
Python 2.X(X <= 6)repr给出一个恒定的17位十进制数字,因为它保证重现原始值.后来的Pythons(2.7,3.1)给出了重现原始值的最小十进制数.
Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on win32
>>> f = 0.38288746115497402
>>> repr(f)
'0.38288746115497402'
>>> float(repr(f)) == f
True
Python 2.7 (r27:82525, Jul 4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] on win32
>>> f = 0.38288746115497402
>>> repr(f)
'0.382887461154974'
>>> float(repr(f)) == f
True
Run Code Online (Sandbox Code Playgroud)
所以最重要的是,如果你想要一个保留浮动对象的所有精度的字符串,请使用preserved = repr(the_float_object)
...稍后恢复该值float(preserved)
.就这么简单.不需要decimal
模块.
归档时间: |
|
查看次数: |
15428 次 |
最近记录: |