C ++, как установить фиксированную десятичную точность для числа с плавающей запятой - PullRequest
3 голосов
/ 12 июля 2011

У меня есть вызов API, который возвращает двойной.Десятичная длина двойного числа может варьироваться от многих десятичных знаков до нескольких (все сводится к состоянию привода).Этот двойной представляет текущую позицию на радиусе диапазона привода.Я не заинтересован в таком подробном номере, потому что он добавляет много шума в систему.Я использовал поплавки для экономии места, но все же у меня есть поплавки, длина которых составляет 6-8.Я не интересуюсь полом или потолком, просто потому что это не делает работу, которую я хочу.Например, у меня есть числа:

-2.05176
-0.104545
 0.30643
 0.140237
 1.41205
-0.176715
 0.559462
 0.364928

Я хочу, чтобы точность была установлена ​​на 2 десятичных знака, несмотря ни на что.Я НЕ говорю о точности вывода на std :: cout, я знаю, как это установить.Я говорю о реальной точности поплавка.То есть: меня интересуют поплавки, которые будут иметь формат 0.XX и фактическую точность 0.XX00000000000.Поэтому преобразование приведенного выше списка в:

-2.05
-0.10
 0.30
 0.14
 1.41
-0.17
 0.55
 0.36

Я знаю, что в boost есть шаблон числового преобразования, но я не могу понять, как конвертировать из числа с плавающей точкой с использованием более низкой точности.Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

6 голосов
/ 12 июля 2011

Не можете ли вы просто округлить его.

float round(float num, int precision)
{
    return floorf(num * pow(10.0f,precision) + .5f)/pow(10.0f,precision);
}
2 голосов
/ 12 июля 2011

Точность float и double зависит от аппаратного обеспечения. Все остальное должно быть закодировано в программном обеспечении.

Вместо этого вы можете попробовать масштабирование, работая в целых числах:

-205
 -10
  30
  14
 141
 -17
  55
  36
...