Есть ли в C ++ функция усечения? - PullRequest
3 голосов
/ 15 июля 2011

Я искал вокруг и не смог найти функцию trunc для C ++. Я знаю, что могу сделать это:

int main()
{
    double a = 12.566789;
    cout << setprecision(2) << fixed << (int)(a * 100) / 100.0 << endl;
    return 0;
}

но я не уверен, что это лучший способ сделать это. Спасибо.

Ответы [ 6 ]

19 голосов
/ 16 июля 2011

Если ваша библиотека C настолько старая, что ей не хватает функции trunc (указанной в C99), вы можете легко реализовать ее на основе floor и ceil (указанной в C89)

double trunc(double d){ return (d>0) ? floor(d) : ceil(d) ; }
4 голосов
/ 15 июля 2011

trunc есть, в <cmath>:

#include <iostream>
#include <cmath>

int main() {
        std::cout << trunc(3.141516) << std::endl; 
}

Полагаю, вы ищете что-то еще?

2 голосов
/ 15 июля 2011

В C есть функция усечения, которую вы можете использовать в C ++

trunc(a*100)/100

Имейте в виду, что вам все равно нужно указывать запросы на форматирование, потому что с плавающей точкой невозможно точно представить все действительные числа, и выможет получить вывод, например 12.5600000001 или 12.55999999, если вы не укажете выходному коду необходимую вам точность.

TL; DR

Используйте для вывода следующее:

cout << setprecision(2) << fixed << a<< endl;

И следующее, если вам нужен усеченный результат где-то во время математического вычисления:

trunc(a*100)/100

(или еще лучше, используйте математику с фиксированной запятой.)

0 голосов
/ 16 июля 2011

Если вы используете древнюю библиотеку C или C ++, которая не поддерживает trunc, используйте boost::math::trunc.

0 голосов
/ 15 июля 2011

Конечно. Используйте функцию trunc() из math.h. Это функция C, но она работает так же хорошо в C ++, как и в C. Если вы хотите сохранить пару цифр, вы всегда можете:

double a = 12.566789;
double b = trunc(a * 100) / 100.0;
0 голосов
/ 15 июля 2011

использовать ceil или floor от cmath

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...