我有两个Python的浮点数,我想减去,即
v1 = float(value1)
v2 = float(value2)
diff = v1 - v2
我想要计算最多两位小数的“diff”,即使用v1的%.2f
和v2的%.2f
来计算它。我怎样才能做到这一点?我知道如何打印v1和v2最多两位小数,但不知道怎么做这样的算术。
我想避免的特殊问题是这个。假设:
v1 = 0.982769777778
v2 = 0.985980444444
diff = v1 - v2
然后我打印以提交以下内容:
myfile.write("%.2f\t%.2f\t%.2f\n" %(v1, v2, diff))
然后我将得到输出:0.98 0.99 0.00,表明v1和v2之间没有差异,即使打印结果表明存在0.01差异。我怎么能绕过这个?
感谢。
答案 0 :(得分:3)
你在评论中说你不想使用decimal
,但听起来你应该在这里使用它。请注意,它不是一个“额外的库”,因为从v2.4开始默认提供Python,你需要import decimal
。当您想要显示值时,您可以使用Decimal.quantize将数字四舍五入到小数点后2位以显示,然后取结果小数的差值。
>>> v1 = 0.982769777778
>>> v2 = 0.985980444444
>>> from decimal import Decimal
>>> d1 = Decimal(str(v1)).quantize(Decimal('0.01'))
>>> d2 = Decimal(str(v2)).quantize(Decimal('0.01'))
>>> diff = d2 - d1
>>> print d1, d2, diff
0.98 0.99 0.01
答案 1 :(得分:1)
我过去曾经使用过穷人的固定点。基本上,使用整数,将所有数字乘以100,然后在打印前将它们除以100。
最近有关Slashdot类似问题的好帖子。
答案 2 :(得分:1)
我发现回合是一个很好的选择。
a = 2.000006
b = 7.45001
c = b - a
print(c) #This gives 5.450004
print(round(c, 2)) ##This gives 5.45
答案 3 :(得分:0)
关于float
类型的事情是你无法真正控制计算的精确度。 float
类型允许硬件进行计算,并且通常以最有效的方式执行。因为浮点数(像大多数机器优化的东西)是二进制的,而不是十进制的,所以强制这些计算具有特定精度的十进制并不简单(或有效)。有关相关的解释,请参阅the last chapter of the Python tutorial。使用浮点数可以做的最好的事情是计算结果(最好是格式化时)。
为了控制实际的计算和精度(十进制表示法,不能少),您应该考虑使用decimal
模块中的十进制数。它可以让你对几乎所有东西有更多的控制权,尽管它会以很快的速度进行控制。
答案 4 :(得分:0)
你是什么意思“两位重要人物”? Python float
有大约15个sigfigs,但它确实有表示错误和舍入错误(decimal.Decimal
也是如此。)http://docs.python.org/tutorial/floatingpoint.html可能会为您提供一个有趣的读物,以及大量的资源关于浮点数。
float
通常具有表示实数的正确精确度,例如物理测量:重量,距离,持续时间,温度等。如果要打印某种显示浮动的方式,请使用你建议的字符串格式。
如果你想准确地表示固定精度的东西,你可能想要使用整数。你必须自己跟踪小数位,但这通常不太难。
推荐使用 decimal.Decimal
太多了。它可以调整到特定的,高于浮点精度,但这很少需要;我不认为我曾经遇到过这个问题,因为有人应该使用decimal.Decimal
。 decimal.Decimal
允许您准确地表示十进制数并控制舍入的工作方式,这使得它适合在某些情况下代表货币。
答案 5 :(得分:0)
您可以使用其他格式字符串对其进行格式化。试试'%.2g'
或'%.2e'
。任何体面的C/C++ reference都将描述不同的说明符。 %.2e
将值格式化为指数表示法中的三位有效数字 - 2
表示小数点后面的两位数字和前面的一位数字。 %.2g
会产生%.2f
或%.2e
,具体取决于哪个会在最小空间内产生两位有效数字。
>>> v1 = 0.982769777778
>>> v2 = 0.985980444444
>>> print '%.2f' %v1
0.98
>>> print '%.2g' %v1
0.98
>>> print '%.2e' %v1
9.83e-01
>>> print '%.2g' %(v2-v1)
0.0032
>>> print '%.2e' %(v2-v1)
3.21e-03