должен предшествовать код, который стремится запустить по ошибке. В вашем конкретном случае просто переместите обработку исключений сразу после «from», например:
org.savino.hb.dataprovider.DataProviderException
true
Возможной (более естественной) альтернативой является try-catch: http: // people. apache.org/~dkulp/camel/try-catch-finally.html
Первый будет работать нормально. 100 будет преобразован в число с плавающей точкой, а IEE754 может представлять все целые числа в точности как числа с плавающей точкой, примерно до 2 23 .
Второй также будет работать, но сначала будет преобразован в целое число, так что вы потеряю точность (это неизбежно, если вы превращаете числа с плавающей точкой в целые числа).
Поскольку вы определили себя как незнакомого с тонкостями чисел с плавающей запятой, я отсылаю вас к этому штрафу статья Дэвида Голдберга: Что должен знать каждый компьютерщик об арифметике с плавающей точкой ( перепечатка на Солнце).
После того, как вы напуганы этим, реальность такова, что Большинство времени с плавающей запятой является огромным благом для выполнения расчетов. А современные компиляторы и языки (включая C) разумно обрабатывают преобразования, поэтому вам не нужно о них беспокоиться. Если вы этого не сделаете.
Поднятые вопросы о точности, безусловно, верны. IEEE float эффективно имеет точность только 24 бита, что меньше 32-битного целого числа.
Арифметика смешанного режима (арифметика между операндами разных типов и / или размеров) является законной, но хрупкой. Стандарт C определяет правила для продвижения типов, чтобы преобразовать операнды в общее представление. Автоматическое продвижение типов позволяет компилятору делать что-то разумное для операций в смешанном режиме, но «разумный» не обязательно означает «правильный».
Чтобы действительно знать, правильное ли поведение, вы должны сначала понять правила для продвижения и затем понять представление типов данных. В очень общих терминах:
float
в double
, short
в int
и т. Д.
без знака или наоборот зависит от размера соответствующих типов) Является ли код типа x> y
(где x
и y
имеют разные типы) Правильно или нет, зависит от значений, которые могут принимать x
и y
. По моему опыту, обычная практика - запрещать (через стандарт кодирования) неявные преобразования типов. Программист должен учитывать контекст и явно выполнять любые необходимые преобразования типов.
Можете ли вы сравнить число с плавающей точкой и целое число? Но проблема, с которой вы столкнетесь, заключается в точности. В большинстве реализаций C / C ++ float и int имеют одинаковый размер (4 байта) и разные уровни точности. Ни один тип не может содержать все значения другого типа. Поскольку один тип не может быть преобразован в другой тип без потери точности и типы не могут сравниваться по нативному типу, выполнение сравнения без учета другого типа приведет к потере точности в некоторых сценариях.
Чтобы избежать потери точности, вы можете преобразовать оба типа в тип, который обладает достаточной точностью, чтобы представлять все значения float и int. В большинстве систем double сделает именно это. Таким образом, следующее обычно выполняет сравнение без потерь
float f = getSomeFloat();
int i = getSomeInt();
if ( (double)i == (double)f ) {
...
}
LHS определяет точность, Поэтому, если ваша LHS - int, а RHS - float, то это приводит к потере точности.
Также взгляните на связанный с FP CFAQ
Да, вы можете сравнивать их, вы можете делать с ними математику, не особенно заботясь о том, что в большинстве случаев. Но только большинство. Большая ошибка заключается в том, что вы можете проверить f и т. Д., Но не следует проверять
f == i
. Целое число и число с плавающей точкой, которые «должны» быть одинаковыми по значению, не обязательно идентичны.
Yeah, it'll work fine. Specifically, the int will be converted to float for the purposes of the conversion. In the second one you'll need to cast to int but it should be fine otherwise.
Да, и иногда это будет делать именно то, что вы ожидаете.
Как отметили другие, сравнивая Например, 1.0 == 1 сработает, потому что целое число 1 приведено к типу double
(не float
) перед сравнением.
Однако другие сравнения могут не выполняться.