Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中将浮点写入CSV——截断错误_Python_Csv_Floating Point_Truncate - Fatal编程技术网

在python中将浮点写入CSV——截断错误

在python中将浮点写入CSV——截断错误,python,csv,floating-point,truncate,Python,Csv,Floating Point,Truncate,我遇到了一个问题,在我写csv的过程中,浮点数被截断了。这是很难复制的,因为它很少发生在数千个文件中,但我需要对它进行保护。下面是代码的示例: import csv import numpy as np x = np.random.normal(0, .001, 1000).tolist() draws_header = ['draw%s'%(x) for x in range(1000)] final_output = np.array(x) outfile = open('filepath.

我遇到了一个问题,在我写csv的过程中,浮点数被截断了。这是很难复制的,因为它很少发生在数千个文件中,但我需要对它进行保护。下面是代码的示例:

import csv
import numpy as np
x = np.random.normal(0, .001, 1000).tolist()
draws_header = ['draw%s'%(x) for x in range(1000)]
final_output = np.array(x)
outfile = open('filepath.csv', 'w')
writer = csv.writer('filepath')
writer.writerow(first_row)
writer.writerows(final_output)
outfile.close()
根据输出(其中所有数字都必须小于1),看起来小数字(即“…e-5”)中的最终字符丢失了:

draw373         draw374         draw375          draw376    
0.000744        0.003008        0.001566         9.727522

关于如何防止这种情况,有什么建议吗?

我建议使用numpy的csv编写器。例如:

>>> import numpy as np
>>> x = np.random.normal(0, .001, 1000)
>>> draws_header = ['draw%s'%(i) for i in range(1000)]
>>> f = open('file.csv', 'w')
>>> np.savetxt(f, np.array(draws_header)[:,None].T, fmt="%s", delimiter="\t")
>>> np.savetxt(f, x[:,None].T, delimiter="\t")
>>> f.close()

这将正确地序列化数字。您还可以将格式字符串传递给savetxt,以指定如何打印浮点值。

问题在于数字的十进制表示法和内存表示法之间的转换

您可以获得有关float的python实现的更多详细信息:

还有关于浮点的全面教程:

特别是我建议您选择“表示错误”一节

如果您的应用程序需要高精度,您可以使用:

#input
from decimal import Decimal
a = Decimal('0.0')
for x in xrange(10):
  a += Decimal('0.1')
print a
#output
1.0

谢谢你的提示--我会给它一个旋转。很好的回答,但是这样会更干净:>>>np.savetxt(f,np.array([draws_header]),fmt=“%s”,delimiter=“\t”)>>>np.savetxt(f,[x],delimiter=“\t”)
#input
from decimal import Decimal
a = Decimal('0.0')
for x in xrange(10):
  a += Decimal('0.1')
print a
#output
1.0