Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как округлить переменную типа double до двух сотых

292
24 июля 2006 года
Matush
726 / / 14.01.2004
Собственно сабж.

P.S Результат нужен в виде X = ФункцияОкругления()
11K
25 июля 2006 года
dosER
17 / / 04.07.2005
что за округление до 2х сотых?
я всегда полагал, что округляют до ..., целых, десятых, сотых, ...

если все ж это была правильная формулировка, то окуругли 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. выглядит не очень, но скорее всего работает
398
25 июля 2006 года
Alexandoros
630 / / 21.10.2005
Округлаять в строку надо, в дабле оно все-равно приблизительно будет.
printf("%.2d", dbl);
292
25 июля 2006 года
Matush
726 / / 14.01.2004
[quote=Alexandoros]Округлаять в строку надо, в дабле оно все-равно приблизительно будет.
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]
240
25 июля 2006 года
aks
2.5K / / 14.07.2006
[QUOTE=Matush]В том то и прикол, что мне надо именно в переменной получить нормальное число.
[/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]
Не должно такого получаться. Какой у вас компилятор кстати и как выводите этот результат?
292
25 июля 2006 года
Matush
726 / / 14.01.2004
[quote=aks]
Не должно такого получаться. Какой у вас компилятор кстати и как выводите этот результат?[/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]
240
25 июля 2006 года
aks
2.5K / / 14.07.2006
И правда. )) В gcc такого не видел. Там правда при приведении к float через некоторое время тоже начнут появляться цифры отличные от нуля - но это нормально. Всетаки тип не точный.
Но макрос написан всетаки правильно )
398
25 июля 2006 года
Alexandoros
630 / / 21.10.2005
Дабл НЕ МОЖЕТ СОДЕРЖАТЬ ТОЧНОГО значения. Не содержал и никогда не будет содержать.
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;
}
292
25 июля 2006 года
Matush
726 / / 14.01.2004
Всем спасибо за активность.

В программе привел все сравнения к целочисельным и не парю себе мозги.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог