Что было бы не так с этой функцией, которая возвращает округленное число в миллионах

#python #pandas

#python #панды

Вопрос:

Я новичок, проходящий онлайн-курс с использованием ipython notebook и panda.

Нам дана функция

 def roundToMillions (value):
    result = round(value / 1000000)
    return result
 

и некоторые тесты

 roundToMillions(4567890.1) == 5

roundToMillions(0) == 0  # always test with zero...

roundToMillions(-1) == 0 # ...and negative numbers

roundToMillions(1499999) == 1 # test rounding to the nearest
 

Нам говорят .. Определите еще несколько тестовых примеров для обеих функций .

Я не могу придумать больше тестов.

Поставленный вопрос:

Почему вы не можете использовать roundToMillions() для округления населения до миллионов жителей?

Я не совсем понимаю, что может быть не так с функцией.

Этот курс бесплатный, и поэтому на самом деле не так много доступной помощи.

Ответ №1:

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

 for x in xrange(-2000000, 2000000, 250000):
print roundToMillions(x), x
>> -2.0 -2000000 
>> -2.0 -1750000
>> -2.0 -1500000
>> -2.0 -1250000
>> -1.0 -1000000
>> -1.0 -750000
>> -1.0 -500000
>> -1.0 -250000
>> 0.0 0
>> 0.0 250000
>> 0.0 500000
>> 0.0 750000
>> 1.0 1000000
>> 1.0 1250000
>> 1.0 1500000
>> 1.0 1750000
 

Так что, очевидно, это округление в меньшую сторону.

Это связано с целочисленным делением. удаление раунда показывает это:

 def roundToMillions (value):
    result = value / 1000000
    return result
print roundToMillions(999999)
>> 0 
 

Это исправлено путем добавления .0 к функции:

 def roundToMillions (value):
    result = round(value / 1000000.0)
    return result

for x in xrange(0, 1000000, 250000):
    print roundToMillions(x), x
>> 0.0 0
>> 0.0 250000
>> 1.0 500000
>> 1.0 750000
print roundToMillions(999999)
>> 1.0
 

Подробнее о целочисленном делении смотрите на

 print (3/2)
>> 1
print (3.0/2.0)
>> 1.5
 

Комментарии:

1. Спасибо за вашу помощь, Дэниел.

2. Спасибо Дэниелу. В вашем коде 1750000 округляется до 1, верно?

3. когда я запускаю roundToMillions (1750000), возвращаемое значение ответа равно 2

4. Попробуйте это с 500 000 и 1 500 000. Если они округляются правильно, то ваша функция верна.

5. Я смущен 1,500000 раундов до 2, что кажется нормальным.