Округление чисел с плавающей запятой в C ++ до одного десятичного знака - PullRequest
2 голосов
/ 17 октября 2010

У меня есть число с плавающей точкой в ​​c ++, и число может быть в разных формах, например 355,5 или 9,9 (это ввод тестового кода).

У меня есть функция, которая

float return_max(angle_set_t *angles)  
{  
    float val;  
    float max;  
    max= angles->key;  
    while( angles != NULL )  
    {  
        val= angles->key;  
        if(max<=val)  
        {  
            max=val;  
        }  
        angles = angles->right;  
    }       
    return max;
}  

max может быть значением с плавающей запятой. Я хочу округлить значение до одного десятичного знака.

Мне нужно общее решение, чтобы оно работало для 355.555555 и 9.999999

float first_aset()
{
    //do somethig
    result=return_max();
    return result;
}

void main()
{
    if( first_aset(S, 357.0, 20.0 ) != 9.9 ||
        first_aset(T, 357.0, 20.0 ) != 9.9 )
    {
         printf("Error in wrap-around interval (3)\n");
         printf(" first in interval [357, 20) in S is %f, should be 9.9\n",
         first_aset(S, 357.0, 20.0 ) );
         printf(" first in interval [357, 20) in T is %f, should be 9.9\n",
         first_aset(T, 357.0, 20.0 ) );
    }
}

здесь проблема ... результат:

Ошибка в интервале обтекания (3)

первый в интервале [357, 20) в S равен 9,900000, должен быть 9,9

первый в интервале [357, 20) в Т равен 9,900000, должен быть 9,9

Ответы [ 5 ]

6 голосов
/ 17 октября 2010
6 голосов
/ 17 октября 2010

Do

answer = static_cast<float>(static_cast<int>(number * 10.)) / 10.;

Если вместо этого вы просто пытаетесь отобразить значение с такой точностью, попробуйте setprecision :

cout << setprecision(1) << number << endl;

В вашем коде вы 'повторное сравнение поплавка с двойным.Это может только плохо закончиться (как и любые сравнения с плавающей запятой).Это может (редко) работать, если вы сравните с 9.9f

4 голосов
/ 17 октября 2010
rounded = truncf(original * 10) / 10;

Однако я согласен с Беном в том, что вам точно не следует проверять точное неравенство.Используйте эпсилон , если необходимо сравнение.

0 голосов
/ 05 апреля 2019

Используйте эту функцию, выглядит сложно, но это то, что спрашивают:

float float_one_point_round(float value)
{
        return ((float)((int)(value * 10))) / 10;
}
0 голосов
/ 17 октября 2010

Как примечание, вы, кажется, создаете свой собственный (навязчивый) связанный список.C ++ уже предоставляет вам различные контейнеры, такие как vector и list.Кроме того, вам не нужно писать функцию, которая определяет максимальное значение в последовательности, просто используйте соответствующий алгоритм из стандартной библиотеки.

#include <vector>
#include <algorithm>

std::vector<float> angles = {0.0, 355.5, 9.9};
float maximum = *std::maximum_element(angles.begin(), angles.end());
...