Не удается вывести десятичные аппроксимации;Python 2 раунда деления на 0 или 1 - PullRequest
0 голосов
/ 10 января 2012

Итак, я решил создать калькулятор гипергеометрического распределения (вероятности и статистику).Проблема в том, что выход всегда будет между 0 и 1. Поэтому Python округляет до 0 или до 1 в зависимости от выходного значения.

Вот мой код

from combinatorics import combination
from combinatorics import permutation
from factorial import factorial
from decimal import Decimal

#Hypergeometric and Binomial Distributions!



def hypergeometric(N, n, r, k):
    hyper = (combination(r, k) * combination(N - r, n - k))/(combination(N, n))
    return hyper

pop = int(raw_input("What is the size of the population? "))
draws = int(raw_input("How many draws were there? "))
spop = int(raw_input("What is the smaller population? "))
success = int(raw_input("How many successes were there? "))

print Decimal(hypergeometric(pop, draws, spop, success))

I 'Я пытался импортировать десятичный модуль, но я не совсем уверен, правильно ли я его использую или для чего он нужен.Любая помощь будет потрясающей!

Редактировать: Например, когда я устанавливаю N = 15, n = 6, r = 5 и k = 3, округляет ответ до 0. Я хотел бы вместо этогораспечатать правильный ответ: .2397802398.Спасибо!

1 Ответ

3 голосов
/ 10 января 2012

Убедитесь, что разделение возвращает число с плавающей точкой вместо целого числа (поскольку все входные переменные являются целыми числами):

def hypergeometric(N, n, r, k):
    return 1.0 * combination(r, k) * combination(N - r, n - k) / combination(N, n)

Альтернатива : я предполагаю, что вы используете Python <3 (иначе эта проблема не возникла бы в первую очередь).Тогда вы можете сделать </p>

from __future__ import division

, что сделает / плавающим делением, тогда как // возвращает целые числа, если заданы целые числа.Просто поместите этот import вверху вашего исходного файла, и вам не придется менять другой код.

...