Как округлить переменную типа double до двух сотых
P.S Результат нужен в виде X = ФункцияОкругления()
я всегда полагал, что округляют до ..., целых, десятых, сотых, ...
если все ж это была правильная формулировка, то окуругли 0.9 до 2х сотых или 0.0000002 до 2х сотых - просвети )
допустим ты имел ввиду получить точность 2 знака после запятой, тогда кустарный метод следующий:
double x;
double delta = x-(long)x;
double tmp = ((long)(delta*1e+4))/10;
delta = tmp - (long)tmp;
if (delta >= 0.5 ) tmp += 1;
x = (long)x+((long)tmp)*1e-3;
P.S. выглядит не очень, но скорее всего работает
printf("%.2d", dbl);
printf("%.2d", dbl);[/quote]
В том то и прикол, что мне надо именно в переменной получить нормальное число.
что-то типа [SIZE=2][COLOR=#0000ff]
#define[/COLOR][/SIZE][SIZE=2] ROUND2(x) (([/SIZE][SIZE=2][COLOR=#0000ff]double[/COLOR][/SIZE][SIZE=2])(([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2])((x + 0.005)*100)))/100.0;[/SIZE]
[SIZE=2] непроходит, число чуть-чуть кривенькое получаеться.[/SIZE]
[SIZE=2]Может есть какие настройки компилятора?[/SIZE]
[SIZE=2]И почему когда 23/100 (double) результат получаеться типа 0,23000000001 ?
[/SIZE]
[/QUOTE]
Ну всегда есть atof() - переводит из строки обратно во float (а его для округленного числа хватит) а float всегда можно перевести в double без потреи. Только надо не printf исспользовать, а sprintf чтобы строку получить.
[QUOTE=Matush]
что-то типа [SIZE=2][COLOR=#0000ff]
#define[/COLOR][/SIZE][SIZE=2] ROUND2(x) (([/SIZE][SIZE=2][COLOR=#0000ff]double[/COLOR][/SIZE][SIZE=2])(([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2])((x + 0.005)*100)))/100.0;[/SIZE]
[SIZE=2] непроходит, число чуть-чуть кривенькое получаеться.[/SIZE]
[/QUOTE]
Почему не подходит и можете привести пример, на котором демонстрируеться кривость?
[QUOTE=Matush]
[SIZE=2]И почему когда 23/100 (double) результат получаеться типа 0,23000000001 ?
[/SIZE][/QUOTE]
Не должно такого получаться. Какой у вас компилятор кстати и как выводите этот результат?
Не должно такого получаться. Какой у вас компилятор кстати и как выводите этот результат?[/quote]
Визуал Студия 2005
Кусок кода
[SIZE=2][COLOR=#0000ff]double[/COLOR][/SIZE][SIZE=2] x = 0.23;
[/SIZE][SIZE=2][COLOR=#0000ff]double[/COLOR][/SIZE][SIZE=2] y = (([/SIZE][SIZE=2][COLOR=#0000ff]double[/COLOR][/SIZE][SIZE=2])(([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2])((x + 0.005)*100)))/100.0;[/SIZE]
[SIZE=2]смотрю результата в дебаггере вижу такое значение y = 0.23000000000000001[/SIZE]
[SIZE=2]Возможно настройки компилятора? Тип процессора?
[/SIZE]
Но макрос написан всетаки правильно )
0.23000000000000001 - это правильное представление числа 0.23 с погрешностью 1-е17. Два дабл числа нельзя сравнивать
Неправильно:
if(d1 == d2)
Правильно:
if(abs(d1 - d2) < eps) - где eps - допустимая погрешность наших вычислений.
Если тебе нужно n правильных знаков, то для n < 20 можно юзать структуру
{
__int64 chislo;
char mesto_desyatichnoy_tochki;
}
иначе
{
char chislo[n];
char mesto_desyatichnoy_tochki;
}
В программе привел все сравнения к целочисельным и не парю себе мозги.