Ограничить точность с плавающей точкой? - PullRequest
9 голосов
/ 02 августа 2010

Есть ли способ округлить числа с плавающей точкой до 2?Например: 3576.7675745342556 становится 3576.76.

Ответы [ 9 ]

14 голосов
/ 02 августа 2010
round(x * 100) / 100.0

Если вам нужно, чтобы все оставалось на плаву:

roundf(x * 100) / 100.0

Гибкая версия с использованием стандартных функций библиотеки:

double GetFloatPrecision(double value, double precision)
{
    return (floor((value * pow(10, precision) + 0.5)) / pow(10, precision)); 
}
13 голосов
/ 02 августа 2010

Если вы распечатываете, используйте любую доступную вам функцию форматирования печати.

В c ++

cout << setprecision(2) << f; 

Для округления для визуализации в GUI используйте std :: ostringstream

3 голосов
/ 02 августа 2010

Умножьте на 100, округлите до целого числа (в любом случае вы хотите), разделите на 100. Обратите внимание, что, поскольку 1/100 не может быть точно представлено в плавающей запятой, рассмотрите возможность сохранения целых чисел с фиксированной точностью.

2 голосов
/ 30 июля 2015

Для тех из вас, кто гуглит, чтобы форматировать деньги как я:

#include <iomanip>
#include <sstream>
#include <string>

std::string money_format (float val)
{
    std::ostringstream oss;

    oss << std::fixed << std::setfill ('0') << std::setprecision (2) << val;

    return oss.str();
}
// 12.3456 --> "12.35"
// 1.2 --> "1.20"

Вы должны вернуть его как строку. Положив его обратно в поплавок потеряет точность.

2 голосов
/ 02 августа 2010

Не используйте поплавки. Используйте целые числа, хранящие количество центов, и напечатайте десятичную точку перед последними двумя знаками, если вы хотите напечатать доллары. Число с плавающей точкой почти всегда неверно для денег, если только вы не делаете упрощенные вычисления (например, наивные экономические математические модели), где действительно важна только величина чисел, и вы никогда не вычитаете соседние числа.

0 голосов
/ 15 октября 2017

Попробуйте, это прекрасно работает

float=3576.7675745342556;
printf("%.2f",float);

изменить некоторые объекты в нем, чтобы увидеть и изучить код.

0 голосов
/ 24 июля 2015

попробуйте использовать

std::cout<<std::setprecision(2)<<std::cout<<x;

должно работать и появляется только 2 цифры после плавающей запятой.

0 голосов
/ 06 августа 2013

Чтобы ограничить точность:
Если x - это число с плавающей запятой, округления нет:
(смещение вверх на 2 десятичных знака, дробь дроби, смещение вниз на 2 десятичных знака)

((int)(x*100.0)) / 100.0F

Поплавок с округлением:

((int)(x*100.0 + 0.5F)) / 100.0F

Двойной без округления:

((long int)(x*100.0)) / 100.0

Двойной с округлением:

((long int)(x*100.0 + 0.5)) / 100.0

Примечание.float или double, дробная часть всегда будет там.Это разница между представлением # ( IEEE 754 ) и точностью #.
C99 поддерживает round ()

0 голосов
/ 02 августа 2010
yourFloatNumber= Float.Round(yourFloatNumber,2); // In C#
...