我试图绕过一些负浮动数字,我想要的格式就像下面的打印/格式方式,而不是圆形。问题是打印方法不是" clean",因为它输出一个带空格的字符串,我从Stackoverflow中的另一个类似问题得到了这个代码。问题是如何格式化/舍入数字,如下面的打印。谢谢
theta = 0.33161255787892263
math = 0 + (1-0) * (1-math.cos(theta))**5
round(math,8) # Result: 4.8e-07 #
print("{:18.8f}".format(math)) # Result: ' 0.00000048' #
答案 0 :(得分:2)
你说“我想要打印的结果,但是浮点数不是字符串”和“结果返回负功率浮点数,我希望将小数格式保留为字符串”。但是你不能这样做,因为你无法控制float
的内部表示:它们全部以二进制形式的科学记数法存储。有关详细信息,请参阅floating-point numbers上的维基百科文章。
所以你是否做
并不重要 v = 0.00000048
或
v = 4.8e-07
这两个陈述都有相同的效果。
请注意,当以二进制写入时,以十进制写入时终止的许多小数可能会重复。以二进制编写时终止的唯一分数是n / (2 ** b)
形式,其中n和b是整数。因此,即使是像0.2这样看似无害的数字也不会在转换为二进制时终止。 (有关更全面的解释,请参阅Wiki链接)。由于这个问题,在你用它们完成所有计算之前,通常不一个圆形浮点数的好主意。
如果将字符串转换为float并再次返回,则必须将其从十进制转换为二进制并再返回。因此,由于每个转换步骤可能存在舍入错误,因此不应将此类操作用于“清理”数字。
当然,有时你做需要将舍入应用到你要继续计算的float
,但如果是这样,你应该谨慎行事并确保你真的了解您对数据所做的工作。
...
您发布的代码还有一些其他奇怪的内容。
math = 0 + (1-0) * (1-math.cos(theta))**5
首先,您应该不使用您作为变量名称导入的模块的名称。执行上述语句后,math
现在引用计算结果,而不是数学模块,因此如果您尝试执行x = math.cos(0.5)
,则会出现错误。同样,请勿将int
,str
,list
等用作变量名称。
其次,0 + (1-0) *
几乎没用。所以上面的陈述可以重写为
result = (1 - math.cos(theta)) ** 5
整个代码段将成为
#! /usr/bin/env python
import math
theta = 0.33161255787892263
result = (1 - math.cos(theta)) ** 5
print round(result, 8)
print("{0:.8f}".format(result))
<强>输出强>
4.8e-07
0.00000048