【问题标题】:How to suppress scientific notation when printing float values?打印浮点值时如何抑制科学计数法?
【发布时间】:2010-10-14 02:41:39
【问题描述】:

这是我的代码:

x = 1.0
y = 100000.0    
print x/y

我的商显示为1.00000e-05

有什么方法可以抑制科学记数法并使其显示为 0.00001?我将使用结果作为字符串。

【问题讨论】:

  • 令人失望的是,这里的答案都没有解决这个问题。如果有一种方法可以阻止 python(3) 使用科学记数法,那将是很好的,除非明确指定。所有答案都要求用户明确禁止科学记数法,这与一般禁止从 python 中隐式使用科学记数法不同。
  • 是的,就像 R 对 options(scipen = 999) 所做的那样

标签: python floating-point


【解决方案1】:

使用较新的版本''.format(还记得指定要显示的.之后的位数,这取决于浮点数有多小)。看这个例子:

>>> a = -7.1855143557448603e-17
>>> '{:f}'.format(a)
'-0.000000'

如上图,默认为6位!这对我们的案例没有帮助,因此我们可以使用如下内容:

>>> '{:.20f}'.format(a)
'-0.00000000000000007186'

更新

从 Python 3.6 开始,可以使用新的formatted string literal 进行简化,如下所示:

>>> f'{a:.20f}'
'-0.00000000000000007186'

【讨论】:

  • 在指定有效数字的同时如何做到这一点?
  • 我想通过使用一个变量,给它所需的位数,并使用它而不是文字数字,例如f"{a:.{precision}f}"
  • 你应该如何知道precision 使用什么值?
  • 它对我不起作用time.time() #shortStuff end = time.time() print( '{:.20}'.format(end - start),"sec")
【解决方案2】:
'%f' % (x/y)

但您需要自己管理精度。例如,

'%f' % (1/10**8)

将只显示零。
details are in the docs

或者对于 Python 3 the equivalent old formattingnewer style formatting

【讨论】:

  • 我建议澄清你的陈述,说“你自己管理显示的精度。”实际(Python 内部)精度没有改变,这在其他语言中经常发生。
【解决方案3】:

对于较新版本的 Python(2.6 及更高版本),您可以使用 ''.format() 来完成 @SilentGhost 的建议:

'{0:f}'.format(x/y)

【讨论】:

  • 这真的是你想要的吗?我不:>>> print('{:f}'.format(0.000000123))0.000000
  • @duality 您可能需要指定精度。 '{0:.10f}'
  • 如果您尝试打印值列表也不起作用。我们需要一个全局格式设置。
【解决方案4】:

如果您正在使用 pandas 并且想要禁止所有浮点数的科学记数法,另一个选项是调整 pandas 选项。

import pandas as pd
pd.options.display.float_format = '{:.2f}'.format

【讨论】:

    【解决方案5】:

    上面的大多数答案都要求您指定精度。但是如果你想显示这样的浮点数,没有不必要的零怎么办:

    1
    0.1
    0.01
    0.001
    0.0001
    0.00001
    0.000001
    0.000000000001
    

    numpy 有答案:np.format_float_positional

    import numpy as np
    
    def format_float(num):
        return np.format_float_positional(num, trim='-')
    

    【讨论】:

      【解决方案6】:

      这适用于任何指数:

      def getExpandedScientificNotation(flt):
          str_vals = str(flt).split('e')
          coef = float(str_vals[0])
          exp = int(str_vals[1])
          return_val = ''
          if int(exp) > 0:
              return_val += str(coef).replace('.', '')
              return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
          elif int(exp) < 0:
              return_val += '0.'
              return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
              return_val += str(coef).replace('.', '')
          return return_val
      

      【讨论】:

        【解决方案7】:

        这是使用 Captain Cucumber's answer,但添加了 2 个。

        1) 允许函数获取非科学记数法数字并按原样返回它们(因此您可以输入大量输入,其中一些数字是 0.00003123 vs 3.123e-05 并且仍然具有函数工作。

        2) 增加了对负数的支持。 (在原始函数中,负数最终会像 -1.08904e-05 的 0.0000-108904)

        def getExpandedScientificNotation(flt):
            was_neg = False
            if not ("e" in flt):
                return flt
            if flt.startswith('-'):
                flt = flt[1:]
                was_neg = True 
            str_vals = str(flt).split('e')
            coef = float(str_vals[0])
            exp = int(str_vals[1])
            return_val = ''
            if int(exp) > 0:
                return_val += str(coef).replace('.', '')
                return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
            elif int(exp) < 0:
                return_val += '0.'
                return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
                return_val += str(coef).replace('.', '')
            if was_neg:
                return_val='-'+return_val
            return return_val
        

        【讨论】:

          【解决方案8】:

          您可以使用内置的format 函数。

          >>> a = -3.42142141234123e-15
          >>> format(a, 'f')
          '-0.000000'
          >>> format(a, '.50f') # Or you can specify precision
          '-0.00000000000000342142141234122994048466990874926279'
          

          【讨论】:

            【解决方案9】:

            如果是string,则使用内置的float 进行转换,例如: print( "%.5f" % float("1.43572e-03")) 答:0.00143572

            【讨论】:

              【解决方案10】:

              除了SG的回答,还可以使用Decimal模块:

              from decimal import Decimal
              x = str(Decimal(1) / Decimal(10000))
              
              # x is a string '0.0001'
              

              【讨论】:

              • 对小于 1e-6 的值转为科学记数法
              【解决方案11】:

              由于这是 Google 上的最高结果,因此在未能找到解决问题的方法后,我将在此处发布。 如果您希望格式化浮点对象的显示值并使其保持浮点而不是字符串,您可以使用以下解决方案:

              创建一个修改浮点值显示方式的新类。

              from builtins import float
              class FormattedFloat(float):
              
                  def __str__(self):
                      return "{:.10f}".format(self).rstrip('0')
              

              您可以通过更改{:f}中的整数值自己修改精度

              【讨论】:

                【解决方案12】:

                将浮点数显示为任意有效数字的更简单的解决方案。这里不需要numpy 或列表推导:

                def sig(num, digits=3):
                    "Return number formatted for significant digits"
                    if num == 0:
                        return 0
                    negative = '-' if num < 0 else ''
                    num = abs(float(num))
                    power = math.log(num, 10)
                    if num < 1:
                        step = int(10**(-int(power) + digits) * num)
                        return negative + '0.' + '0' * -int(power) + str(int(step)).rstrip('0')
                    elif power < digits - 1:
                        return negative + ('{0:.' + str(digits) + 'g}').format(num)
                    else:
                        return negative + str(int(num))
                

                我在示例中去除尾随 0 并显示完整整数:sig(31415.9) = 31415 而不是 31400。如果您不喜欢,请随意修改代码。

                测试:

                for power in range(-8,8):
                    num = math.pi * 10**power
                    print(str(num).ljust(25), sig(num))
                

                【讨论】:

                  【解决方案13】:

                  如果是 numpy 数组,您可以使用抑制命令作为抑制

                  import numpy as np
                  np.set_printoptions(suppress=True)
                  

                  【讨论】:

                    【解决方案14】:

                    在使用 3.6.4 时,我遇到了类似的问题,即随机输出文件中的数字在使用时会被科学计数法格式化:

                    fout.write('someFloats: {0:0.8},{1:0.8},{2:0.8}'.format(someFloat[0], someFloat[1], someFloat[2]))
                    

                    我所要做的就是添加“f”:

                    fout.write('someFloats: {0:0.8f},{1:0.8f},{2:0.8f}'.format(someFloat[0], someFloat[1], someFloat[2]))
                    

                    【讨论】:

                      【解决方案15】:

                      从 3.6 开始(可能也适用于稍旧的 3.x),这是我的解决方案:

                      import locale
                      locale.setlocale(locale.LC_ALL, '')
                      
                      def number_format(n, dec_precision=4):
                          precision = len(str(round(n))) + dec_precision
                          return format(float(n), f'.{precision}n')
                      

                      precision 计算的目的是确保我们有足够的精度来避免科学记数法(默认精度仍然是 6)。

                      dec_precision 参数增加了用于小数点的额外精度。由于这使用了n 格式,因此不会添加无关紧要的零(与f 格式不同)。 n 还将负责呈现不带小数的已舍入整数。

                      n 确实需要 float 输入,因此需要演员表。

                      【讨论】:

                        猜你喜欢
                        • 2021-12-21
                        • 2020-12-29
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-09-24
                        • 1970-01-01
                        相关资源
                        最近更新 更多