python-3.x 格式化不带尾随零的浮点数

ijnw1ujt  于 2023-03-13  发布在  Python
关注(0)|答案(7)|浏览(185)

当我在Python 3中做一个简单的除法时,比如123000/1000,我得到123.0,或者4/2,我得到2.0。我如何去掉Python 3除法中的尾随零?
编辑:我不希望只是简单的整数除法。例如,1234/1000应该给予1.234。为了清楚,这个问题是关于格式化输出,而不是内部表示。

u59ebvdq

u59ebvdq1#

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

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

因此,只需使用常规除法,如4/2,然后格式化字符串。https://docs.python.org/2/library/string.html#format-specification-mini-language“从有效数中删除不重要的尾随零,如果小数点后面没有剩余数字,则也会删除小数点。”

e3bfsja2

e3bfsja22#

结果为“float”是“正确的”行为,而.0部分只是简单地指出了这一事实。我认为对你来说重要的是结果在字符串中的“表示”。所以你不应该改变实际结果,而只应该改变它的“显示”方式。使用格式化迷你语言:

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

ljsrvy3e3#

您可以使用以下内容:

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'说明符没有此问题。但是使用了科学记数法我不知道这是否是操作员想要的。
上面的解决方案将数字转换为“可良好打印的字符串表示形式”(str(x)),然后使用标准字符串方法删除尾随零(.rstrip('0')),如果需要,删除剩余的尾随句点(.rstrip('.'))(以避免“1.”)。
注意:我添加了向float的强制转换,以确保代码对整数也能正确工作,以防有人需要。

oalqel3c

oalqel3c4#

这对我来说很好用。大数字没有科学记数法格式。

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
>>>
yxyvkwin

yxyvkwin5#

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
ylamdve6

ylamdve66#

如果你能保证只得到一个尾随的零,那么强制转换为int就可以去掉它:

>>> 4/2
2.0
>>> int(4/2)
2
rfbsl7qr

rfbsl7qr7#

#  // => 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

相关问题