为什么 float() 会切断尾随零?
Why does float() cut off trailing zeros?
该代码成功地将一个包含许多数字的大文件裁剪为几个带有数字的较小文本文件,但它产生了一个有趣的怪癖。
所有数字都应精确到小数点后四位,例如 2.7400,但它们打印为 2.74。
这是文件中的一个片段
0.96
0.53
0.70
0.53
0.88
0.97
为什么会这样?有没有办法解决这个问题或者这只是 float() 的一个怪癖?
from itertools import islice
def number_difference(iterable):
return float(iterable[-1].strip('\n')) - float(iterable[0].strip('\n'))
def file_crop(big_fname, chunk_fname, no_lines):
with open(big_fname, 'r') as big_file:
big_file.readline()
ifile = 0
while True:
data = list(islice(big_file, no_lines))
if not data:
break
with open('{}_{}.locs'.format(chunk_fname, ifile), 'w') as small_file:
offset = int(float(data[0].strip('\n')))
map(lambda x: str(float(x.strip('\n')) - offset) + '\n', data)
small_file.write('{} {} L\n'.format(len(data), number_difference(data)))
small_file.write(''.join(map(lambda x: str(round((float(x.strip('\n')) - offset),4)) + '\n', data)))
ifile += 1
您可以通过格式化输出来保留零:
例如:如果输出为 0.96,
x= 0.96
"{0:.4f}".format(x)
输出:
'0.9600'
尽管输出将是一个字符串..
下面的文章可能值得一读:
https://docs.python.org/2/tutorial/floatingpoint.html
它解释了为什么 Python 以上述格式显示浮点数。
浮点数只是python(和其他编程语言)中的近似值...例如,小数被计算为二进制值。很难找到大多数以 10 为基数的运算的准确值
仔细阅读此 link 后,您会明白为什么 python 没有给出以 2 为基数转换的操作的确切值
https://docs.python.org/2/tutorial/floatingpoint.html
使用打印也可以完成这项工作
print("%.4f" % 0.96) or
whatever_file.write("%.4f" % 0.96)
IEEE 754 浮点数(其中 float
是 binary64)不是为保存精度信息而设计的。如果您需要这样做,那么您应该改用 decimal.Decimal
。
>>> decimal.Decimal('0.70')
Decimal('0.70')
>>> print decimal.Decimal('0.70')
0.70
查看 decimal
documentation 了解完整详情。
该代码成功地将一个包含许多数字的大文件裁剪为几个带有数字的较小文本文件,但它产生了一个有趣的怪癖。
所有数字都应精确到小数点后四位,例如 2.7400,但它们打印为 2.74。
这是文件中的一个片段
0.96
0.53
0.70
0.53
0.88
0.97
为什么会这样?有没有办法解决这个问题或者这只是 float() 的一个怪癖?
from itertools import islice
def number_difference(iterable):
return float(iterable[-1].strip('\n')) - float(iterable[0].strip('\n'))
def file_crop(big_fname, chunk_fname, no_lines):
with open(big_fname, 'r') as big_file:
big_file.readline()
ifile = 0
while True:
data = list(islice(big_file, no_lines))
if not data:
break
with open('{}_{}.locs'.format(chunk_fname, ifile), 'w') as small_file:
offset = int(float(data[0].strip('\n')))
map(lambda x: str(float(x.strip('\n')) - offset) + '\n', data)
small_file.write('{} {} L\n'.format(len(data), number_difference(data)))
small_file.write(''.join(map(lambda x: str(round((float(x.strip('\n')) - offset),4)) + '\n', data)))
ifile += 1
您可以通过格式化输出来保留零:
例如:如果输出为 0.96,
x= 0.96
"{0:.4f}".format(x)
输出:
'0.9600'
尽管输出将是一个字符串..
下面的文章可能值得一读: https://docs.python.org/2/tutorial/floatingpoint.html
它解释了为什么 Python 以上述格式显示浮点数。
浮点数只是python(和其他编程语言)中的近似值...例如,小数被计算为二进制值。很难找到大多数以 10 为基数的运算的准确值
仔细阅读此 link 后,您会明白为什么 python 没有给出以 2 为基数转换的操作的确切值
https://docs.python.org/2/tutorial/floatingpoint.html
使用打印也可以完成这项工作
print("%.4f" % 0.96) or
whatever_file.write("%.4f" % 0.96)
IEEE 754 浮点数(其中 float
是 binary64)不是为保存精度信息而设计的。如果您需要这样做,那么您应该改用 decimal.Decimal
。
>>> decimal.Decimal('0.70')
Decimal('0.70')
>>> print decimal.Decimal('0.70')
0.70
查看 decimal
documentation 了解完整详情。