Я наткнулся на сбой теста, вызванный точностью с плавающей запятой, и пытаюсь понять это.
Вкратце: Python3 round
возвращает различное значение в зависимости от того, является ли тип float или numpy.float64, хотя я думал, что float==double==float64
и оба Python 3 и NumPy должен округляться ближе к четному.
Вот пример:
npVal = np.float64(435)/100
pyVal = 435/100
print(round(npVal,1)) // 4.4
print(round(pyVal,1)) // 4.3
print(round(np.float64(pyVal),1)) // 4.4
print(round(float(npVal),1)) // 4.3
Я понимаю, что 4.35 и 4.4 могут быть не совсем точно представлены в double, но почему numpy round отличается от Python, хотя они оба используют одни и те же типы данных и задают схожую функцию? Я использовал явное деление, чтобы избежать ошибок округления ввода.
Я точно не знаю, является ли значение double для 4.35 чуть более или менее, поэтому я не могу сказать , какая из этих реализаций является (может быть?) Неправильной.
Есть похожий вопрос: Странное поведение numpy.round
Там было отмечено, что NumPy «округляет до ближайшего четного значения» и «изменилось поведение между Python 2 и Python 3; Python 3 ведет себя так же, как NumPy».
Так что оба должны делать то же самое и округлять до ближайшего четного значения. Так что , если 4.35 будет точным числом с плавающей запятой, 4.4 будет правильным ответом и должен быть возвращен обоими.