I am reading a text file with floating point numbers, all with either 1 or 2 decimal points. I am using float()
to convert a line into a float, and raising a ValueError
if that fails. I am storing all floats in a list. When printing it out, I'd like to print it out as a 2 decimal places floating point.
我正在读一个带有浮点数的文本文件,所有的都有1或2个小数点。我使用float()将一行转换为浮点数,如果失败,则会抛出ValueError。我将所有的浮点数存储在一个列表中。打印出来的时候,我想把它打印出来,小数点后2位。
Assume I have a text file with the numbers -3,65, 9,17, 1. I read each one, and once I convert them to float and append them to a list. Now in Python 2, calling float(-3.65)
returns -3.65
. In Python 3 however, float(-3.65) returns
-3.6499999999999999` which loses its precision.
假设我有一个文本文件,数字是-3 65 9 17 1。我读取每一个,然后我将它们转换为浮点数并将它们附加到一个列表中。现在在Python 2中,调用float(-3.65)返回-3.65。然而,在Python 3中,float(-3.65)返回- 3.649999999999999999,这就失去了它的精度。
I want to print the list of floats, [-3.6499999999999999, 9.1699999999999999, 1.0]
with 2 decimal points only. Doing something along the lines of '%.1f' % round(n, 1)
would return a string. How can I return a list of all two decimal points of floats, and not strings? So far, I rounded it using [round(num, 2) for num in list]
but would need to set the decimal points / precision instead of round()
.
我想打印出浮点数的列表,只有两个小数点。沿着“%”的线做一些事情。1f' % round(n, 1)将返回一个字符串。如何返回所有两个浮点数的列表,而不是字符串?到目前为止,我使用[round(num, 2)对num的列表进行了圆滑,但是需要设置小数点/精度,而不是round()。
5 个解决方案
#1
14
In a word, you can't.
总之,你不能。
3.65
cannot be represented exactly as a float
. The number that you're getting is the nearest number to 3.65
that has an exact float
representation.
3.65不能完全表示为浮点数。你得到的数字是最近的数到3.65,它有一个精确的浮点数表示。
The difference between (older?) Python 2 and 3 is purely due to the default formatting.
的区别(老?)Python 2和3纯粹是由于默认格式。
I am seeing the following both in Python 2.7.3 and 3.3.0:
我在Python 2.7.3和3.3.0中看到了以下内容:
In [1]: 3.65
Out[1]: 3.65
In [2]: '%.20f' % 3.65
Out[2]: '3.64999999999999991118'
For an exact decimal datatype, see decimal.Decimal
.
对于精确的十进制数据类型,请参阅小数。
#2
22
The simple way to do this is by using the round buit-in.
最简单的方法就是用圆补。
round(2.6463636263,2)
would be displayed as 2.65
.
圆形(2.6463636263,2)将显示为2.65。
#3
13
The comments state the objective is to print to 2 decimal places.
评论陈述的目标是打印到小数点后两位。
There's a simple answer for Python 3:
对于Python 3,有一个简单的答案:
>>> num=3.65
>>> "The number is {:.2f}".format(num)
'The number is 3.65'
or equivalently with f-strings (Python 3.6+):
或者用f-string (Python 3.6+)表示:
>>> num = 3.65
>>> f"The number is {num:.2f}"
'The number is 3.65'
As always, the float value is an approximation:
与往常一样,浮点值是一个近似值:
>>> "{}".format(f)
'3.65'
>>> "{:.10f}".format(f)
'3.6500000000'
>>> "{:.20f}".format(f)
'3.64999999999999991118'
I think most use cases will want to work with floats and then only print to a specific precision.
我认为大多数用例都希望使用浮点数,然后只打印到特定的精度。
Those that want the numbers themselves to be stored to exactly 2 decimal digits of precision, I suggest use the decimal type. More reading on floating point precision for those that are interested.
我建议使用十进制类型,那些希望将数字本身存储到精确的2位小数的人。更多关于浮点精度的阅读,对于那些感兴趣的。
#4
1
Try to understand through this below function using python3
使用python3来尝试理解下面这个函数。
def floating_decimals(f_val, dec):
prc = "{:."+str(dec)+"f}" #first cast decimal as str
print(prc) #str format output is {:.3f}
return prc.format(f_val)
print(floating_decimals(50.54187236456456564, 3))
Output is : 50.542
输出:50.542
Hope this helps you!
希望这可以帮助你!
#5
0
Try this:
试试这个:
num = input("Please input your number: ")
num = float("%0.2f" % (num))
print(num)
I believe this is a lot simpler. For 1 decimal place use %0.1f
. For 2 decimal places use %0.2f
and so on.
我相信这要简单得多。对于1位小数使用%0.1f。小数点后2位使用%0。2f等等。
Or, if you want to reduce it all to 2 lines:
或者,如果你想把它减少到2行:
num = float("%0.2f" % (float(input("Please input your number: "))))
print(num)
#1
14
In a word, you can't.
总之,你不能。
3.65
cannot be represented exactly as a float
. The number that you're getting is the nearest number to 3.65
that has an exact float
representation.
3.65不能完全表示为浮点数。你得到的数字是最近的数到3.65,它有一个精确的浮点数表示。
The difference between (older?) Python 2 and 3 is purely due to the default formatting.
的区别(老?)Python 2和3纯粹是由于默认格式。
I am seeing the following both in Python 2.7.3 and 3.3.0:
我在Python 2.7.3和3.3.0中看到了以下内容:
In [1]: 3.65
Out[1]: 3.65
In [2]: '%.20f' % 3.65
Out[2]: '3.64999999999999991118'
For an exact decimal datatype, see decimal.Decimal
.
对于精确的十进制数据类型,请参阅小数。
#2
22
The simple way to do this is by using the round buit-in.
最简单的方法就是用圆补。
round(2.6463636263,2)
would be displayed as 2.65
.
圆形(2.6463636263,2)将显示为2.65。
#3
13
The comments state the objective is to print to 2 decimal places.
评论陈述的目标是打印到小数点后两位。
There's a simple answer for Python 3:
对于Python 3,有一个简单的答案:
>>> num=3.65
>>> "The number is {:.2f}".format(num)
'The number is 3.65'
or equivalently with f-strings (Python 3.6+):
或者用f-string (Python 3.6+)表示:
>>> num = 3.65
>>> f"The number is {num:.2f}"
'The number is 3.65'
As always, the float value is an approximation:
与往常一样,浮点值是一个近似值:
>>> "{}".format(f)
'3.65'
>>> "{:.10f}".format(f)
'3.6500000000'
>>> "{:.20f}".format(f)
'3.64999999999999991118'
I think most use cases will want to work with floats and then only print to a specific precision.
我认为大多数用例都希望使用浮点数,然后只打印到特定的精度。
Those that want the numbers themselves to be stored to exactly 2 decimal digits of precision, I suggest use the decimal type. More reading on floating point precision for those that are interested.
我建议使用十进制类型,那些希望将数字本身存储到精确的2位小数的人。更多关于浮点精度的阅读,对于那些感兴趣的。
#4
1
Try to understand through this below function using python3
使用python3来尝试理解下面这个函数。
def floating_decimals(f_val, dec):
prc = "{:."+str(dec)+"f}" #first cast decimal as str
print(prc) #str format output is {:.3f}
return prc.format(f_val)
print(floating_decimals(50.54187236456456564, 3))
Output is : 50.542
输出:50.542
Hope this helps you!
希望这可以帮助你!
#5
0
Try this:
试试这个:
num = input("Please input your number: ")
num = float("%0.2f" % (num))
print(num)
I believe this is a lot simpler. For 1 decimal place use %0.1f
. For 2 decimal places use %0.2f
and so on.
我相信这要简单得多。对于1位小数使用%0.1f。小数点后2位使用%0。2f等等。
Or, if you want to reduce it all to 2 lines:
或者,如果你想把它减少到2行:
num = float("%0.2f" % (float(input("Please input your number: "))))
print(num)