2013-08-27 2 views
4
>>> a = 0.3135 
>>> print("%.3f" % a) 
0.314 
>>> a = 0.3125 
>>> print("%.3f" % a) 
0.312 
>>> 

Я ожидаю 0,313 вместо 0,312 Любые мысли о том, почему это и есть альтернативный способ я могу использовать, чтобы получить 0,313?питон неправильно округление с числами с плавающей точкой

Благодаря

+0

Просто 'round (a)'? – alecxe

+3

Любая причина, по которой 3,7 миллиарда других вопросов по SO, охватывающих эту тему, вам не подходит? :-) – paxdiablo

+3

Поиск 'IEEE 754' и' round to even'. Округление * не * неверно. Он соответствует стандарту. – Bakuriu

ответ

5

Python 3 раунда в соответствии со стандартом IEEE 754, используя round-to-even подход.

Если вы хотите, чтобы округлить в другую сторону, а затем просто реализовать его вручную: использование

import math 
def my_round(n, ndigits): 
    part = n * 10 ** ndigits 
    delta = part - int(part) 
    # always round "away from 0" 
    if delta >= 0.5 or -0.5 < delta <= 0: 
     part = math.ceil(part) 
    else: 
     part = math.floor(part) 
    return part/(10 ** ndigits) 

Пример:

In [12]: my_round(0.3125, 3) 
Out[12]: 0.313 

Примечание: в python2 округлении всегда прочь от нуля, а в python3 он округляется до четного. (см., например, разницу в документации для функции round между 2.7 и 3.3).

Смежные вопросы