mod
равно 0, когда оно делится, и в Хаскеле тоже не до конца. Попробуйте вместо этого:
checkLeap :: (Int, Int, Int) -> Bool
checkLeap (x,y,z)
| z `mod` 400 == 0 = True
| z `mod` 4 == 0 && z `mod` 100 /= 0 = True
| otherwise = False
Все целые числа, которые могут быть представлены числами с плавающей запятой, имеют точное представление. Так что вы можете безопасно использовать int
для результата. Неточные представления возникают только в том случае, если вы пытаетесь представить рациональное число со знаменателем, не являющимся степенью двойки.
То, что это работает, совсем нетривиально! Свойство представления с плавающей запятой IEEE заключается в том, что int∘floor = ⌊⋅⌋, если величина рассматриваемых чисел достаточно мала, но возможны различные представления, где int (floor (2.3)) может быть 1.
To цитата из Википедии ,
Любое целое число с абсолютным значением меньше или равным 2 24 может быть точно представлено в формате одинарной точности, а любое целое число с абсолютным значением меньше или равно 2 53 может быть точно представлено в формате двойной точности.
df ['Column_Name']=df ['Column_Name'].astype (интервал)
math.floor
всегда будет возвращать целое число, и поэтому int (math.floor (some_float))
никогда не приведет к ошибкам округления.
Ошибка округления могла уже быть введена в math.floor (some_large_float)
, хотя, или даже при сохранении большого числа в float в первую очередь. (Большие числа могут потерять точность при хранении в числах с плавающей запятой.)
Вы можете использовать функцию round. Если вы не используете второй параметр (# значащих цифр), то, я думаю, вы получите желаемое поведение.
Вывод IDLE.
>>> round(2.99999999999)
3
>>> round(2.6)
3
>>> round(2.5)
3
>>> round(2.4)
2