代码之家  ›  专栏  ›  技术社区  ›  Kozyarchuk

Python浮点到十进制的转换

  •  42
  • Kozyarchuk  · 技术社区  · 17 年前

    Python Decimal不支持从float构造;它要求您首先将float转换为字符串。

    这非常不方便,因为浮点的标准字符串格式化程序要求您指定小数位数,而不是有效位数。所以,如果你有一个数字,可能有多达15位小数,你需要格式化为 Decimal("%.15f" % my_float) ,如果在小数点之前还有任何有效数字,则将在小数点后15位产生垃圾( Decimal("%.15f" % 100000.3) == Decimal('100000.300000000002910') ).

    7 回复  |  直到 4 年前
        1
  •  70
  •   pyjavo knbk    7 年前

    Python<2.7

    "%.15g" % f
    

    或者在Python 3.0中:

    format(f, ".15g")
    

    Python 2.7+,3.2+

    把浮子递给我就行了 Decimal 直接构造,如下所示:

    from decimal import Decimal
    Decimal(f)
    
        2
  •  29
  •   nosklo    17 年前

    你在问题中说:

    有人能提出一个很好的解决方法吗 从浮点转换为十进制 进入

    但每次用户输入值时,它都是作为字符串输入的,而不是作为浮点输入的。您正在将其转换为某个浮动。直接将其转换为十进制,不会丢失精度。

        3
  •  25
  •   vincent wen    14 年前

    我建议这样做

    >>> a = 2.111111
    >>> a
    2.1111110000000002
    >>> str(a)
    '2.111111'
    >>> decimal.Decimal(str(a))
    Decimal('2.111111')
    
        4
  •  5
  •   muhuk    17 年前

    Python确实支持从浮点创建十进制。你先把它当作一根弦来投。但是字符串转换不会导致精度损失。首先,要转换的浮点值没有那种精度。(否则就不需要十进制)

    我想这里的困惑是 ,但一旦解释器使用该文本,内部表示就变成一个浮点数。

        5
  •  4
  •   Federico A. Ramponi    17 年前

    浮点的“官方”字符串表示形式由内置的repr()给出:

    >>> repr(1.5)
    '1.5'
    >>> repr(12345.678901234567890123456789)
    '12345.678901234567'
    

    您可以使用repr()代替格式化字符串,结果不会包含任何不必要的垃圾。

        6
  •  2
  •   Paul Fisher    17 年前

    当您说“保存用户输入的值”时,为什么不将用户输入的值存储为字符串,并将其传递给十进制构造函数?

        7
  •  2
  •   Deep Patel    6 年前

    import json
    from decimal import Decimal
    
    float_value = 123456.2365
    decimal_value = json.loads(json.dumps(float_value), parse_float=Decimal)
    
        8
  •  1
  •   Community Mohan Dere    9 年前

    “正确”的方法在1990年由 Steele and White's and Clinger's PLDI 1990

    你也可以看看 this frap 使浮动合理化。

        9
  •  1
  •   Chris    6 年前

    主要答案有点误导。这个 g format(0.012345, ".2g") 返回0.012-小数点后三位。如果需要严格限制小数位数,请使用 f 格式化程序: format(0.012345, ".2f") == 0.01

        10
  •  1
  •   Ryabchenko Alexander    4 年前

    Decimal(float).quantize(Decimal("1.00000"))
    
        11
  •  0
  •   mmj    5 年前

    this answer 我找到了一种解决方法,它允许从一个浮点绕过(只是表面上)十进制数来缩短十进制数的构造

    import decimal
    class DecimalBuilder(float):
        def __or__(self, a):
             return decimal.Decimal(str(a))
    
    >>> d = DecimalBuilder()
    >>> x = d|0.1
    >>> y = d|0.2
    >>> x + y # works as desired
    Decimal('0.3')
    >>> d|0.1 + d|0.2 # does not work as desired, needs parenthesis
    TypeError: unsupported operand type(s) for |: 'decimal.Decimal' and 'float'
    >>> (d|0.1) + (d|0.2) # works as desired
    Decimal('0.3')
    

    这是一种变通方法,但它确实可以节省代码类型,而且可读性很强。

    推荐文章