我如何格式化一个浮点数,使它不包含尾随零?换句话说,我希望得到的字符串尽可能短。
例如:
3 -> "3"
3. -> "3"
3.0 -> "3"
3.1 -> "3.1"
3.14 -> "3.14"
3.140 -> "3.14"
我如何格式化一个浮点数,使它不包含尾随零?换句话说,我希望得到的字符串尽可能短。
例如:
3 -> "3"
3. -> "3"
3.0 -> "3"
3.1 -> "3.1"
3.14 -> "3.14"
3.140 -> "3.14"
当前回答
OP希望删除多余的零,并使生成的字符串尽可能短。
我发现%g指数格式缩短了非常大和非常小的值的结果字符串。问题出现在不需要指数符号的值上,比如128.0,它既不是很大也不是很小。
这里有一种将数字格式化为短字符串的方法,仅在Decimal时使用%g指数表示法。Normalize创建的字符串太长。这可能不是最快的解决方案(因为它使用Decimal.normalize)
def floatToString (inputValue, precision = 3):
rc = str(Decimal(inputValue).normalize())
if 'E' in rc or len(rc) > 5:
rc = '{0:.{1}g}'.format(inputValue, precision)
return rc
inputs = [128.0, 32768.0, 65536, 65536 * 2, 31.5, 1.000, 10.0]
outputs = [floatToString(i) for i in inputs]
print(outputs)
# ['128', '32768', '65536', '1.31e+05', '31.5', '1', '10']
其他回答
对于float,你可以使用这个:
def format_float(num):
return ('%i' if num == int(num) else '%s') % num
测试:
>>> format_float(1.00000)
'1'
>>> format_float(1.1234567890000000000)
'1.123456789'
Decimal参见解决方案:https://stackoverflow.com/a/42668598/5917543
使用宽度足够大的%g,例如'%.99g'。 它将以定点符号打印任何相当大的数字。
编辑:它不起作用
>>> '%.99g' % 0.0000001
'9.99999999999999954748111825886258685613938723690807819366455078125e-08'
>>> str(a if a % 1 else int(a))
如果你能接受3个。3.0以“3.0”的形式出现,这是一种非常简单的方法,从浮点数表示中右移零:
print("%s"%3.140)
(感谢@ellimilial指出了例外情况)
以下是答案:
import numpy
num1 = 3.1400
num2 = 3.000
numpy.format_float_positional(num1, 3, trim='-')
numpy.format_float_positional(num2, 3, trim='-')
输出“3.14”和“3”
Trim ='-'删除后面的0和小数。