Python 3浮点小数点/精度

Python 3浮点小数点/精度,python,python-3.x,floating-point,Python,Python 3.x,Floating Point,我正在读取一个带有浮点数的文本文件,所有浮点数都是1或2个小数点。我正在使用float()将一行转换为一个float,如果转换失败,将引发一个ValueError。我正在列表中存储所有浮动。打印时,我想将其打印为小数点后2位的浮点 假设我有一个数字为-3,65,9,17,1的文本文件。我读了每一个,一旦我把它们转换成float并将它们附加到一个列表中。现在在Python 2中,调用float(-3.65)返回-3.65。然而,在Python3中,float(-3.65)返回-3.64999999

我正在读取一个带有浮点数的文本文件,所有浮点数都是1或2个小数点。我正在使用
float()
将一行转换为一个float,如果转换失败,将引发一个
ValueError
。我正在列表中存储所有浮动。打印时,我想将其打印为小数点后2位的浮点

假设我有一个数字为-3,65,9,17,1的文本文件。我读了每一个,一旦我把它们转换成float并将它们附加到一个列表中。现在在Python 2中,调用
float(-3.65)
返回
-3.65
。然而,在Python3中,
float(-3.65)返回
-3.649999999999`这将失去其精度

我想打印浮动列表,
[-3.649999999999999,9.16999999999999,1.0]
,仅带两个小数点。按照
'%.1f'%round(n,1)
的行进行操作将返回一个字符串。如何返回所有浮点小数点的列表,而不是字符串?到目前为止,我使用
[round(num,2)for num in list]
对其进行四舍五入,但需要设置小数点/精度,而不是
round()

3.65
不能准确地表示为
浮点值
。您得到的数字是最接近于
3.65
的数字,该数字具有精确的
float
表示形式

Python2和Python3(旧版本?)之间的差异完全是由于默认的格式

我在Python 2.7.3和3.3.0中看到了以下内容:

In [1]: 3.65
Out[1]: 3.65

In [2]: '%.20f' % 3.65
Out[2]: '3.64999999999999991118'

有关精确的十进制数据类型,请参见。

执行此操作的简单方法是使用圆形内置项


四舍五入(2.64636263,2)
将显示为
2.65

注释说明目标是打印到小数点后2位

Python 3有一个简单的答案:

>>> num=3.65
>>> "The number is {:.2f}".format(num)
'The number is 3.65'
或与f字符串(Python 3.6+)等效:

与往常一样,浮点值是一个近似值:

>>> "{}".format(num)
'3.65'
>>> "{:.10f}".format(num)
'3.6500000000'
>>> "{:.20f}".format(num)
'3.64999999999999991118'
我认为大多数用例都希望使用浮动,然后只打印到特定的精度


对于那些希望数字本身精确存储为2位小数精度的人,我建议使用该类型。对于那些感兴趣的人。

尝试使用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))
输出为:50.542

希望这对你有帮助

试试这个:

num = input("Please input your number: ")

num = float("%0.2f" % (num))

print(num)
我相信这要简单得多。小数点后1位使用
%0.1f
。对于小数点后2位,请使用
%0.2f

或者,如果要将其全部减少到两行:

num = float("%0.2f" % (float(input("Please input your number: "))))
print(num)

在python 2中,
float(-3.65)
也是
-3.649999999999
。。这是正常的
float本质上不是100精确的。在我看来不是:
Python2.7.2(v2.7.2:85274271420116年6月11日,15:22:34)│ [GCC 4.2.1(苹果公司建造5666)(dot 3)]关于达尔文│ 有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。│ >>> 浮动(-3.65)│ -3.65
另外,让我指出,我知道
float
不精确,我知道这背后的原因。我正在寻找一个答案,它将显示如何在Python3中以2个小数点打印出来。感谢基本上,由于浮点运算的方式,您不能真正做到这一点。我建议您在十进制< /代码>模块中考虑使用<代码>十进制< /代码>类。这只是Python在十进制后面的最多16个位置的表示。因此,没有办法将小数点的数量限制为数字类型吗?要打印3.65,我需要将其打印为字符串?@Darksky One只能打印字符串。有时转换没有那么明确:但总是这样。是的,那么我如何将
3.649999999991118
表示为
3.65
或任何小数点为2的东西,而不是字符串?除了float之外,我还可以使用其他类型吗?在
Decimal
模块中使用
Decimal
而不是float-point。我以为Python不久前就有这种变化了。更改为
float
格式,使其成为最短的字符串,可以转换回您正在打印的确切
float
。基本上是试图让这种舍入问题在大部分时间内消失。这一变化没有变成蟒蛇3吗?我想我在2.6或2.7的变更日志中看到了它。OP不需要变量来定义精度-它被设置为2个位置。但是对于可变精度,您不需要使用神秘的字符串加法
prc=“{:.”+str(dec)+“f}”
。相反,嵌入精度:
print(“数字为{:.{}f}”.format(f_val,dec))
。相同,但f字符串:
print(f“数字为{f_val:.{dec}f}”)
。这是一个完美的解决方案,因为我没有看到f字符串的更新。老实说,我不确定我是否是一个球迷,但很高兴知道!对于可能不知道该特性的另一个用户来说,使用f字符串似乎不是很容易理解。另一方面,阅读时使用“{}”.format()更直观。谢谢。尝试在上阅读文档,在试图找到答案时差点死掉,并放弃了,但请注意,在给定浮点值时,
round()
会给出令人惊讶的结果。这里提到的示例:“
四舍五入(2.675,2)
给出的是
2.67
,而不是预期的
2.68
num = float("%0.2f" % (float(input("Please input your number: "))))
print(num)