【问题标题】:How to print floating point numbers as it is without any truncation in python?python - 如何在没有任何截断的情况下打印浮点数?
【发布时间】:2013-11-18 13:27:43
【问题描述】:

我有一些数字 0.0000002345E^-60。我想按原样打印浮点值。 这样做的方法是什么? print %f 将其截断为 6 位数字。 %n.nf 也给出了固定的数字。不截断的打印方式是什么。

【问题讨论】:

  • 您希望如何打印?
  • 不确定是否可以轻松实现非标准化的科学打印。
  • 我希望它按原样打印。没有任何四舍五入或截断。
  • 你不能只打印 60 个 0,然后再打印其余的吗?
  • 对于你的例子,你想打印 0.0000002345?????

标签: python


【解决方案1】:

像这样?

>>> print('{:.100f}'.format(0.0000002345E-60))
0.0000000000000000000000000000000000000000000000000000000000000000002344999999999999860343602938602754

正如您可能从输出中注意到的那样,您想要如何做并不是很清楚。由于浮点表示,您会失去精度并且不能真正精确地表示数字。因此,您希望数字停止显示的位置并不清楚。

另请注意,指数表示通常用于更明确地显示该数字所具有的significant digits 的数量。

您也可以使用decimal 来避免因二进制浮点截断而丢失精度:

>>> from decimal import Decimal
>>> d = Decimal('0.0000002345E-60')
>>> p = abs(d.as_tuple().exponent)
>>> print(('{:.%df}' % p).format(d))
0.0000000000000000000000000000000000000000000000000000000000000000002345

【讨论】:

    【解决方案2】:

    你可以使用decimal.Decimal:

    >>> from decimal import Decimal
    >>> str(Decimal(0.0000002345e-60))
    '2.344999999999999860343602938602754401109865640550232148836753621775217856801120686600683401464097113374472942165409862789978024748827516129306833728589548440037314681709534891496105046826414763927459716796875E-67'
    

    这是由文字 0.0000002345e-60 创建的 float 的实际值。它的值是一个可以用python float表示的数字,最接近实际的0.0000002345 * 10**-60

    float 一般用于近似计算。如果你想要准确的结果,你应该使用其他东西,比如提到的Decimal

    【讨论】:

      【解决方案3】:

      如果我理解,你想打印一个浮点数吗?

      问题是,你不能打印浮点数。

      您只能打印浮点数的字符串表示形式。所以,简而言之,你不能打印一个浮点数,这就是你的答案。

      如果您接受需要打印浮点数的字符串表示形式,并且您的问题是如何为浮点数的字符串表示形式指定首选格式,那么根据 cmets 判断,您的问题非常不清楚。

      如果您想以指数表示法打印浮点数的字符串表示,那么格式规范语言允许这样做:

      {:g} 或 {:G},取决于您是否希望输出中的 E 大写)。这绕过了 e 和 E 类型的默认精度,这会导致在指数符号之前的部分出现不需要的尾随 0。

      假设您的值为my_float"{:G}".format(my_float) 将按照 Python 解释器的打印方式打印输出。您可能只打印没有任何格式的数字并获得相同的确切结果。

      如果您的目标是以非指数形式以当前精度打印浮点数的字符串表示,用户poke 描述了一种通过将浮点数转换为 Decimal 对象来实现此目的的好方法。

      如果由于某种原因您不想这样做,您可以执行this answer 中提到的类似操作。但是,您应该将“max_digits”设置为sys.float_info.max_10_exp,而不是答案中使用的 14。这需要您在代码之前的某个时间点 import sys

      一个完整的例子是:

      import math
      import sys
      
      def precision_and_scale(x):
          max_digits = sys.float_info.max_10_exp
          int_part = int(abs(x))
          magnitude = 1 if int_part == 0 else int(math.log10(int_part)) + 1
          if magnitude >= max_digits:
              return (magnitude, 0)
          frac_part = abs(x) - int_part
          multiplier = 10 ** (max_digits - magnitude)
          frac_digits = multiplier + int(multiplier * frac_part + 0.5)
          while frac_digits % 10 == 0:
              frac_digits /= 10
          scale = int(math.log10(frac_digits))
          return (magnitude + scale, scale)
      
      f = 0.0000002345E^-60
      
      p, s = precision_and_scale(f)
      
      print "{:.{p}f}".format(f, p=p)
      

      但总体而言,我认为涉及强制转换为 Decimal 的方法可能更好。

      【讨论】:

      • 好的,如果我的变量 m 包含上面提到的值。如何获取 .0003434E-56 形式的字符串
      • 你不应该有一个 Python 浮点值,如你所显示的那样。 Python(至少在 Windows 的 cPython 2.7.x 中)将 .0003434E-56 显示为 3.434E-60,这等效且更紧凑。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多