Python 3浮点小数点/精度
我正在读取一个带有浮点数的文本文件,所有浮点数都是1或2个小数点。我正在使用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
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)