格式化浮点数而不落后零



当我在python 3中做一个简单的划分时,例如123000/1000,我得到123.0或4/2,我得到2.0。我如何摆脱python 3的尾部零?

编辑:我不想只是简单的整数部门。对于EX,1234/1000应给出1.234。需要明确的是,这个问题是关于格式化输出,而不是内部表示形式。

感谢您的帮助!答案来自@vaultah:

>>> f'{2.1:g}'
'2.1'
>>> f'{2.0:g}'
'2'

因此,只需使用常规部门,例如4/2,然后格式化字符串。从" G"的文档:https://docs.python.org/2/library/string.html#format-specification-mini-langue"从显着条件中删除了微不足道的尾随零,如果没有剩余的数字,也将删除小数点。"

结果是"正确"的行为,因此.0部分仅表示这一事实。我认为对您来说重要的是字符串中结果的"表示"。因此,您不应该更改实际结果,而只能更改其"显示"的方式。使用格式的迷你语言:

>>> for val in (123000/1000, 4/2, 1234/1000): print(f"{val:g}")  # Use "General format" to represent floats
...                                                                                                                                                                                                                              
123                                                                                                                                                                                                                              
2                                                                                                                                                                                                                                
1.234

您可以使用类似的东西:

def remove_trailing_zeros(x):
    return str(float(x)).rstrip('0').rstrip('.')
remove_trailing_zeros(1.23)  # '1.23'
remove_trailing_zeros(4.0)  # '4
remove_trailing_zeros(1000)  # '1000'

通常,您将使用标准字符串格式化选项,例如'%2.1f' % number或其他多种方法来格式化字符串。但是,然后您必须指定要显示的数字数量,但是在这种情况下,要返回的尾随零的数量是可变的。'%g'格式指定符没有此问题,而是使用科学符号,我不知道这是否是OP想要的。

上面的解决方案将数字转换为a&quot"良好可打印字符串表示"。(str(x)(,然后删除尾随的零(.rstrip('0')(,并在必要时使用剩余的尾随时间(.rstrip('.')((结果避免" 1."(使用标准字符串方法。

注意:我将演员表添加到float中,以确保代码也适用于整数,以防万一任何人都需要。

这对我来说很好。没有大数的科学符号格式。

def no_trailing_zero(value: float) -> Union[float, int]:
    return int(value) if value % 1 == 0 else float(str(value))
>>> no_trailing_zero(50)
50
>>> no_trailing_zero(50.11)
50.11
>>> no_trailing_zero(50.1100)
50.11
>>> no_trailing_zero(50.0)
50
>>> no_trailing_zero(500000000.010)
500000000.01
>>>

mod是O(1(操作,几乎不为您的实际程序添加开销。您也可以将其制成一个衬里

x = a//b if not a % b else a/b

如果您需要做很多事情,请将其变成函数

def func(a, b):
    return a//b if not a % b else a/b
func(10, 2)      # out = 5
func(10, 3)      # out = 3.333333333
func(1200, 100)  # out = 12
func(1234, 1000) # out = 1.234

如果您可以保证自己只得到尾部为零,则施放到int上可以摆脱它:

>>> 4/2
2.0
>>> int(4/2)
2
#  // => used for integer output
#   / => used for double output
x = 100/35      # => 2.857142857142857
y = 100//35     # => 2
z = 100.//35    # => 2.0    # floating-point result if divisor or dividend real

最新更新