Python 3浮点数/精度。

时间:2021-11-03 17:07:47

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)