【问题标题】:How to format a float with a maximum number of decimal places and without extra zero padding?如何格式化具有最大小数位数且没有额外零填充的浮点数?
【发布时间】:2012-05-17 07:06:03
【问题描述】:

我需要在 python 中做一些小数位格式。优选地,浮点值应始终显示至少一个起始 0 和一个小数位。示例:

Input: 0
Output: 0.0

小数位数较多的值应继续显示,直到输出 4。所以:

Input: 65.53
Output: 65.53

Input: 40.355435
Output: 40.3554

我知道我可以使用 {0.4f} 让它打印到小数点后四位,但它会用不需要的 0 填充。是否有格式代码告诉它打印出一定数量的小数,但如果没有数据则将它们留空?我相信 C# 可以通过以下方式实现这一点:

floatValue.ToString("0.0###")

# 符号代表一个可以留空的地方。

【问题讨论】:

    标签: python string-formatting padding


    【解决方案1】:

    通过反复试验,我认为 :.15g 是您想要的:

    In: f"{3/4:.15g}"
    Out: '0.75'
    
    In f"{355/113:.15g}"
    Out: '3.14159292035398'
    

    (而f"{3/4:.15f}" == '0.750000000000000'

    【讨论】:

      【解决方案2】:

      您的要求应通过内置round 函数等舍入方法来解决。然后让float 数字以其string 表示形式自然显示。

      >>> round(65.53, 4)  # num decimal <= precision, do nothing
      '65.53'
      >>> round(40.355435, 4)  # num decimal > precision, round
      '40.3554'
      >>> round(0, 4)  # note: converts int to float
      '0.0'
      

      【讨论】:

      • ..... 是的。是的,就是这样。我一直在寻找格式,因为这就是原始代码完成它的方式,但这就是我想要的。猜猜你可以称之为脑放屁。
      • 这不起作用; round(0.000000001, 4)0.0
      【解决方案3】:

      对不起,我能做到的最好的:

      ' {:0.4f}'.format(1./2.).rstrip('0')
      

      更正:

      ff=1./2.
      ' {:0.4f}'.format(ff).rstrip('0')+'0'[0:(ff%1==0)]
      

      【讨论】:

      • 你已经成功了。他的 C# 示例将 1 格式化为 '1.0',而您的将其格式化为 '1.'
      • float('{:0.4f}'.format(x).rstrip('0')) 这也应该解决传递整数的问题。 >>>float('{:0.4f}'.format(1).rstrip('0')) 1.0
      • @tapan:返回浮点数,而不是字符串。
      【解决方案4】:
      >>> def pad(float, front = 0, end = 4):
          s = '%%%s.%sf' % (front, end) % float
          i = len(s)
          while i > 0 and s[i - 1] == '0':
              i-= 1
          if s[i - 1] == '.' and len(s) > i:
              i+= 1 # for 0.0
          return s[:i] + ' ' * (len(s) - i)
      
      >>> pad(0, 3, 4)
      '0.0   '
      >>> pad(65.53, 3, 4)
      '65.53  '
      >>> pad(40.355435, 3, 4)
      '40.3554'
      

      【讨论】:

      • 你已经成功了。他的 C# 示例将1.0 格式化为'1.0',而您的将其格式化为'1.'
      • 有趣的解决方案。它适用于整数,但尝试传入一个值,比如说,2.5 似乎总是返回None。我会多花点时间。我有点希望格式函数中内置了一些东西来处理这个问题。
      • 哦,对不起 - 我从我的 pyshell 复制了它,它看起来不错,但它破坏了标识。
      • 现在似乎可以工作了。除非有人能提出更适合我的解决方案,否则我会给出答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      相关资源
      最近更新 更多