2013-05-16 2 views
0

У меня возникла проблема с определением, является ли переменная целой. Не тип переменной, а фактическое значение, хранящееся в переменной. Я пробовал использовать variable % 1 в качестве теста, но он, похоже, не работает. Здесь не код, я использую для теста:Определение, является ли переменная численно целочисленным в Python

if ((xmax - x0)/h) % 1 == 0: 
    pass 
elif ((xmax - x0)/h) % 1 != 0: 
    print "fail" 

Независимо от того, какие значения присутствуют для Xmax, х0, и Л, оператор всегда проходит. Например, если они равны 2,5 (2,5% 1 = .5), они все равно пройдут. Я попытался, если/else, поэтому я попробовал инструкцию else if, как указано выше, и он тоже не работает.

+2

Использовать 'int (x) == x' – MostafaR

+0

Спасибо, это самый простой из ответов. Не могу поверить, что я не думал об этом раньше! – danielunderwood

+0

[Проверить, является ли double равномерно делимым другим двойником в C?] (Http://stackoverflow.com/q/2083290/4279) – jfs

ответ

0

Чтобы узнать, есть ли число с плавающей точкой целое значение, можно назвать .is_integer() method:

>>> 2.0 .is_integer() 
True 
>>> 2.5 .is_integer() 
False 

Если xmax, x0, h являются int экземпляры затем проверить, является ли (xmax - x0) равномерно делится на h то есть ли результат truediv(xmax - x0, h) представляет собой целое число:

if (xmax - x0) % h == 0: 
    pass 

Для значений с плавающей точкой, используют math.fmod(x, y) instead of x % y to avoid suprising results:

from math import fmod 

if fmod(xmax - x0, h) == 0: 
    pass 

В в большинстве случаев вы можете сравнить с некоторым допуском:

eps = 1e-12 * h 
f = fmod(xmax - x0, h) 
if abs(f) < eps or abs(f - h) < eps: 
    pass 

Результат fmod является точным сам по себе, но, возможно, аргументы могут быть не такими, как eps.

+0

Вау, я не знал об этих методах, которые намного проще. Благодаря! – danielunderwood

0

его просто ...

if isinstance(var, int): 
    pass 
else: 
    fail 
+0

Проверить его на 'var = 2.0', он работает? – MostafaR

+0

Я протестировал его в оболочке python и вернул False для 2.0. Однако в моем сценарии он всегда возвращает true, будет ли это 2.0 или 2.5. Ни один из других методов не работает внутри моего скрипта. EDIT: Я просто не заметил, где печаталось неудачно. – danielunderwood

1

Если обе стороны / являются int, результат будет слишком - по крайней мере, в Python 2.x. Таким образом, ваш тест для целочисленного значения всегда будет истинным.

Вы можете преобразовать одну или другую сторону, чтобы float и это даст результат с плавающей запятой:

if (float(xmax - x0)/h) % 1 == 0: 

Вы также можете импортировать поведение с Python 3, который всегда возвращает результат с плавающей точкой от деления:

from __future__ import division 
Смежные вопросы