Округлення - тривіальна задача в математиці, але в Qt немає функції округлення до певного розряду. Проте в QtMath є такі функції як qFloor (qreal) і QCeil (qreal), в результаті яких int. А також можна використовуючи round (double), отримати double.
Дуже швидко я знайшов ось цей ресурс звідки взяв вихідну формулу. Вона без сумніву працює, але дає результати, які не відповідаю моїм очікуванням:
Після невеликої корекції самої функції, її підсумковий варіант виглядає так:
Тепер результати, як мені здається, більш правильні:
Дуже швидко я знайшов ось цей ресурс звідки взяв вихідну формулу. Вона без сумніву працює, але дає результати, які не відповідаю моїм очікуванням:
toRound(187.156, 2); //187.15
toRound(187.156, 1); //187.1
toRound(187.156, 0); //187
toRound(187.156, -1); //180
toRound(187.156, -2); //100
Після невеликої корекції самої функції, її підсумковий варіант виглядає так:
double wcsv::toRound(double val, int r) {
double outpValue;
double tempVal;
tempVal=val*pow(10,r);
if (double(int(tempVal))+0.5==tempVal){
int(tempVal)%2 == 0
? outpValue=double(qFloor(tempVal))/pow(10,r)
:outpValue=double(qCeil(tempVal))/pow(10,r);
} else {
double(int(tempVal))+0.5>tempVal
? outpValue=double(qFloor(tempVal))/pow(10,r)
:outpValue=double(qCeil(tempVal))/pow(10,r);
}
return(outpValue);
}
Тепер результати, як мені здається, більш правильні:
toRound(187.156, 2); //187.16
toRound(187.156, 1); //187.2
toRound(187.156, 0); //187
toRound(187.156, -1); //190
toRound(187.156, -2); //200
Коментарі
Дописати коментар