Qt / C ++: Как округлить плавающее число до ближайшего положительного числа с точностью до 2 десятичных знаков - PullRequest
1 голос
/ 01 апреля 2020

Я работаю над конверсией некоторых единиц. Итак, одно из результирующих преобразований - 0,0024, но я хочу представить это в 2 десятичном формате, например, 0,01.

Так что, когда я пытаюсь с помощью функции qround и Qstring :: number (), вернуть 0.

double x = Qstring::number(0.0024, 'f', 2); double y = qround(0.0024);

здесь x и y равно 0

Поэтому мой вопрос заключается в том, как округлить его до ближайшего положительного числа 0,01

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

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

#include <iostream>

namespace MyApp
{
   double trim(double in)
   {
      int v1 = static_cast<int>(in);             // The whole number part.
      int v2 = static_cast<int>((in - v1)*100);  // First two digits of the fractional part.
      double v3 = (in - v1)*100 - v2;            // Is there more after the first two digits?
      if ( v3 > 0 )
      {
         ++v2;
      }

      return (v1 + 0.01*v2);
   }
}

int main()
{
   std::cout << MyApp::trim(0.0024) << std::endl;
   std::cout << MyApp::trim(100) << std::endl;
   std::cout << MyApp::trim(100.220) << std::endl;
   std::cout << MyApp::trim(100.228) << std::endl;
   std::cout << MyApp::trim(0.0004) << std::endl;
}

Вывод:

0.01
100
100.22
100.23
0.01
0 голосов
/ 03 апреля 2020

Вы хотите округлить значение до , иначе называемое «потолком» результата. Просто «округление» числа всегда будет округлять вниз, если значение <.5, и наоборот. Вам также понадобится некоторая базовая c математика, чтобы указать число десятичных знаков, к которым нужно округлить. </p>

#include <QtMath>

double y = qCeil(0.0024 * 100.0) * 0.01;  // y = 0.01

Или без Qt:

#include <cmath>
using std::ceil;
double y = ceil(0.0024 * 100.0) * 0.01;  // y = 0.01

100.0 и 0.01 соответствует количеству десятичных разрядов, которое вы получите sh в итоге. Для одного десятичного знака это будет 10.0 / 0.1, или для трех 1000.0 / .001 и т. Д.

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

ceil(0.0024 * 100.0) / 100.0;

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