Независимо от того, заканчивается ли плавание .5. C ++ - PullRequest
0 голосов
/ 29 апреля 2018

Я хочу проверить, заканчивается ли значение с плавающей запятой на .5 или нет, если возможно, используя оператор if-else. Спасибо

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

... чтобы проверить, заканчивается ли значение с плавающей запятой на .5

Используйте modf(), чтобы найти дробную часть.

Функции modf разбивают аргумент value на целые и дробные части, каждая из которых имеет тот же тип и знак, что и аргумент.

#include <cmath>

float ipart;  // The integral is found, but not used.
if (std::fabs(std::modf(x, &ipart)) == .5) {
  ;  // value of a float ends in .5
}
0 голосов
/ 01 мая 2018

Чтобы получить десятичную часть действительного числа в c++, мы можем использовать функцию modf(), содержащуюся в std пространстве имен (std::modf()) в библиотеке <cmath>. Эта функция получит только десятичную часть действительного числа типа float, double или long double. Чтобы получить абсолютное значение десятичной части, вам нужно использовать функцию fabs(), содержащуюся в std пространстве имен (std::fabs()) в библиотеке <cmath>. Вы можете объединить их так:

#include <cmath>

...

std::cout << "The absolute decimal part is: " << std::fabs(std::modf(realNumber, &entirePart));

Чтобы проверить, равна ли десятичная часть числа 0,5, вы можете использовать условный троичный оператор (?:) и сохранить результат проверки в значении bool или в значении int.

На этой странице упоминается и объясняется условная троица оператор (?:) с примером:

Условный оператор вычисляет выражение, возвращая одно значение если это выражение имеет значение true, а другое, если выражение оценивается как ложное. Его синтаксис:

condition ? result1 : result2;

Если условие истинно, все выражение оценивается как result1, и в противном случае результат2.

7==5 ? 4 : 3     // evaluates to 3, since 7 is not equal to 5.
7==5+2 ? 4 : 3   // evaluates to 4, since 7 is equal to 5+2.  5>3 ? a : b      // evaluates to the value of a, since 5 is greater than 3.
a>b ? a : b      // evaluates to whichever is greater, a or b.  
7==5 ? 4 : 3     // evaluates to 3, since 7 is not equal to 5.
7==5+2 ? 4 : 3   // evaluates to 4, since 7 is equal to 5+2.  5>3 ? a : b      // evaluates to the value of a, since 5 is greater than 3.
a>b ? a : b      // evaluates to whichever is greater, a or b.

Вот коды, которые вы можете использовать для решения вашей проблемы:

Сохранить результат в переменной bool:

#include <cmath>

...
// Here you're declaring the real number variable.
float realNumber = -4.6f;
// In this variable will be stored the entire part of realNumber variable.
float entirePart = 0f;
// Then you create a bool that will be true if the decimal part is equal to 0.5.
bool check = ( std::fabs(std::modf(realNumber, &entirePart)) == 0.5) ? true : false ;

// result: check = false

Сохранить результат в переменной int:

#include <cmath>

...
// Here you're declaring the real number variable.
float realNumber = -4.6f;
// In this variable will be stored the entire part of realNumber variable.
float entirePart = 0f;
// Then you create a bool that will be true if the decimal part is equal to 0.5.
int check = ( std::fabs(std::modf(realNumber, &entirePart)) == 0.5) ? 1 : 0 ;

// result: check = 0

Более подробную информацию об операторах c++ можно получить по следующим ссылкам:

CPlusPlus: операторы.

Условный (или троичный) оператор (?:)

C ++ Условно? : Оператор

0 голосов
/ 29 апреля 2018
#include <cmath>
…
if (x - std::trunc(x) == .5 || x - std::trunc(x) == -.5)
    …

(Примечание: x - std::floor(x) == .5 работает везде, кроме одного случая: если x является следующим представимым значением, большим, чем -.5, тогда std::floor(x) равно -1, а идеальный математический результат x - std::floor(x) немного больше чем -.5, но округление с плавающей точкой дает ровно -.5, поэтому x - std::floor(x) == .5 ложно возвращает true. И альтернатива - std::fabs(x) - std::floor(std::fabs(x)) == .5.)

...