2013-05-15 2 views
4

Как ни странно, я не могу найти, как чисто преобразовать float в int.Как преобразовать float в int в современном C++

Этот метод

int int_value = (int)(float_value + 0.5); 

запускает

warning: use of old-style cast 

в НКУ.

Итак, что такое современный стиль, простой способ преобразования float в int? (Я согласен с потерей точности, конечно)

+2

Самый современный способ - 'std :: round'. – chris

+0

Что делает 'int int_value = float_value + .5f;' do? Подсказка: 0.5 - это двойной. –

+0

@chris 'round' вернет поплавок. Вы можете называть 'lround', но это возвращает длинный, а не int. О, теперь я вижу, что вы говорите только о закругленной части, а не о кастинге. Это научит меня читать весь вопрос, прежде чем комментировать :-) – Praetorian

ответ

4

Как сказал Джош в комментариях, + 0.5 не очень надежный. Для обеспечения дополнительной безопасности можно объединить static_cast с std::round так:

int int_value = static_cast<int>(std::round(float_value)); 

Для части отливки см this excellent post для объяснения.

+5

'+ 0.5' - на удивление ненадежный способ округлить, из-за математических проблем с плавающей запятой. См. Http://blog.frama-c.com/index.php?post/2013/05/02/nearbyintf1. –

+0

@JoshKelley, хороший пункт. Ред. –

+0

'static_cast' здесь ничего не делает; как только вы закончили 'std :: round', вы можете просто забыть его (и получить неопределенное поведение, если поток не подходит), или вы можете присвоить результаты' float' и проверить на 'std :: numeric_limits :: max() 'и' std :: numeric_limits :: min' перед выполнением задания. («Lexical_cast» - очень плохая идея, так как она не работает.) –

1

попробовать:

int int_value = static_cast<int>(float_value + 0.5); 

FYI: different casts in C++ дал очень хорошее объяснение о тех 4 слепков, введенных в C++.

1

Вы также могли бы рассмотреть

int int_value = boost::lexical_cast<int>(float_value); 

lexical_cast имеет преимущество работы для всех примитивных типов и Сейнт строки и т.д. Это также означает, что вы не должны делать (float_value + 0,5) вещи.

+0

Это не сработает, если промежуточная строка содержит десятичную точку, и это, скорее всего, для поплавка. Или, если поплавок огромен. Кроме того, для округления отрицательных значений вы хотите вычесть 0.5, поэтому округление в любом случае не так просто. –

Смежные вопросы