圆形负浮点数到浮点数

时间:2014-11-12 01:17:42

标签: python

我试图绕过一些负浮动数字,我想要的格式就像下面的打印/格式方式,而不是圆形。问题是打印方法不是" 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' # 

1 个答案:

答案 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),则会出现错误。同样,请勿将intstrlist等用作变量名称。

其次,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