Я пытаюсь оптимизировать следующее. Код ниже делает это:C/C++ округление десятичных знаков с определенной точностью, эффективно
Если а = 0,775 и мне нужно Прецизионный 2 дп, то а => 0,78
В принципе, если последняя цифра 5, он округляется вверх следующая цифра, иначе она не ,
Моя проблема заключалась в том, что 0,45 не округляется до 0,5 с 1 десятичной точкой, так как значение сохраняется как 0,4999999343 .... .... setprecision округляет его до 0,4.
Именно поэтому setprecision вынуждена быть выше setprecision(p+10)
, а затем, если она действительно заканчивается на 5, добавьте небольшую сумму, чтобы округлить правильно.
После этого он сравнивает a со строкой b и возвращает результат. Проблема в том, что эта функция называется несколько миллиардов раз, что делает программу craw. Любые лучшие идеи о том, как переписать/оптимизировать это и какие функции в коде настолько тяжелы на машине?
bool match(double a,string b,int p) { //p = precision no greater than 7dp
double t[] = {0.2, 0.02, 0.002, 0.0002, 0.00002, 0.000002, 0.0000002, 0.00000002};
stringstream buff;
string temp;
buff << setprecision(p+10) << setiosflags(ios_base::fixed) << a; // 10 decimal precision
buff >> temp;
if(temp[temp.size()-10] == '5') a += t[p]; // help to round upwards
ostringstream test;
test << setprecision(p) << setiosflags(ios_base::fixed) << a;
temp = test.str();
if(b.compare(temp) == 0) return true;
return false;
}
Я не уверен, что я понимаю ваши примеры наверху. Как вы получаете 0,66, округляя 0,6652 до 2 десятичных знаков? Почему вы округливаете, основываясь на последней цифре числа вместо цифры после точки прецизионного отсечения? –
Правда, удалил этот пример, это было, как вы сказали. – Milan
Я думаю, что проблема в постановке задачи нуждается в уточнении. Вы говорите об округлении, но код соответствует сопоставлению строкового представления с приблизительным значением с плавающей запятой. Что вы на самом деле пытаетесь сделать? Кроме того, это не похоже на любое округление, которое я видел раньше. Обычно вы округляете, если следующая цифра (превышающая желаемую точность) составляет 5 или более. Кажется, вы проверяете ровно 5. –