o
    ,1º]m  ã                   @   sD   d Z ddlmZmZmZ ddlmZmZ d	dd„Zdd„ Z	dgZ
dS )
zD
``python-future``: pure Python implementation of Python 3 round().
é    )ÚPYPYÚPY26Úbind_method)ÚDecimalÚROUND_HALF_EVENNc                 C   s²   d}|du r
d}d}t | dƒr|  |¡S |dk rtdƒ‚tdƒ|  }tr1dtt| ƒƒv r1t| ƒ} t| tƒr9| }nt	sFt 
| ¡j|td	�}n	t| ƒj|td	�}|rUt|ƒS t|ƒS )
a©  
    See Python 3 documentation: uses Banker's Rounding.

    Delegates to the __round__ method if for some reason this exists.

    If not, rounds a number to a given precision in decimal digits (default
    0 digits). This returns an int when called with one argument,
    otherwise the same type as the number. ndigits may be negative.

    See the test_round method in future/tests/test_builtins.py for
    examples.
    FNTr   Ú	__round__z"negative ndigits not supported yetÚ10Únumpy)Úrounding)Úhasattrr   ÚNotImplementedErrorr   r   ÚreprÚtypeÚfloatÚ
isinstancer   Ú
from_floatÚquantizer   Úfrom_float_26Úint)ÚnumberÚndigitsÚ
return_intÚexponentÚd© r   úU/var/www/html/myproject/venv/lib/python3.10/site-packages/future/builtins/newround.pyÚnewround   s,   


ÿr   c           	      C   s¦   ddl }ddlm} t| ttfƒrt| ƒS | | ¡s| | ¡r%tt	| ƒƒS | 
d| ¡dkr0d}nd}t| ƒ ¡ \}}dd„ }||ƒd }||t|d|  ƒ| ƒ}|S )	aî  Converts a float to a decimal number, exactly.

    Note that Decimal.from_float(0.1) is not the same as Decimal('0.1').
    Since 0.1 is not exactly representable in binary floating point, the
    value is stored as the nearest representable value which is
    0x1.999999999999ap-4.  The exact equivalent of the value in decimal
    is 0.1000000000000000055511151231257827021181583404541015625.

    >>> Decimal.from_float(0.1)
    Decimal('0.1000000000000000055511151231257827021181583404541015625')
    >>> Decimal.from_float(float('nan'))
    Decimal('NaN')
    >>> Decimal.from_float(float('inf'))
    Decimal('Infinity')
    >>> Decimal.from_float(-float('inf'))
    Decimal('-Infinity')
    >>> Decimal.from_float(-0.0)
    Decimal('-0')

    r   N)Ú_dec_from_tripleg      ð?é   c                 S   s    | dkrt tt| ƒƒƒd S dS )Nr   é   )ÚlenÚbinÚabs)r   r   r   r   Ú
bit_length\   s   z!from_float_26.<locals>.bit_lengthé   )ÚmathÚdecimalr   r   r   Úlongr   ÚisinfÚisnanr   Úcopysignr"   Úas_integer_ratioÚstr)	ÚfÚ_mathr   ÚsignÚnr   r#   ÚkÚresultr   r   r   r   :   s   r   )N)Ú__doc__Úfuture.utilsr   r   r   r&   r   r   r   r   Ú__all__r   r   r   r   Ú<module>   s    
.
,