Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/26: Рейтинг темы: голосов - 26, средняя оценка - 4.50
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
1

double в int

25.11.2013, 17:55. Просмотров 5256. Ответов 31
Метки нет (Все метки)

собственно вопрос в шапке, как перевести double в int? т.е. также как работает делфийская функция round, округлить до целых и выдать число в формате int
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2013, 17:55
Ответы с готовыми решениями:

Преобразовать 2 числа int в 1 число float(double) | double int1.int2
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения...

Double, int , long double
Как вычислить диапазоны типов вручную указанных в название темы?

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double
Думаю из-за polp #include<iostream> #include<cmath> #include<cstdlib>...

int и double
//--------------------------------------------------------------------------- ...

int* to double*
double* myDoublePtr; int myInt = 5; int* myIntPtr; myIntPtr =...

31
newbie666
Заблокирован
25.11.2013, 17:57 2
double a = 2.345;
int b = (int)a;
0
hwmlex
41 / 41 / 22
Регистрация: 30.01.2013
Сообщений: 133
25.11.2013, 17:59 3
или можно так:

C++
1
2
double x;
int a = static_cast<int>(x);
0
LuxArt
35 / 22 / 10
Регистрация: 14.11.2013
Сообщений: 85
25.11.2013, 18:21 4
Цитата Сообщение от GetHelp Посмотреть сообщение
также как работает делфийская функция round, округлить до целых
Цитата Сообщение от newbie666 Посмотреть сообщение
double a = 2.345;
int b = (int)a;
Цитата Сообщение от hwmlex Посмотреть сообщение
double x;
int a = static_cast<int>(x);
И оба мимо
У вас нет округления, а только отбрасывание дробной части
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
25.11.2013, 18:27  [ТС] 5
Цитата Сообщение от newbie666 Посмотреть сообщение
double a = 2.345;
int b = (int)a;
выдает 0

Добавлено через 25 секунд
Цитата Сообщение от hwmlex Посмотреть сообщение
или можно так:

C++
1
2
double x;
int a = static_cast<int>(x);
а вот так норм спс
0
newbie666
Заблокирован
25.11.2013, 18:31 6
Цитата Сообщение от LuxArt Посмотреть сообщение
У вас нет округления, а только отбрасывание дробной части
так правильно:
C++
1
2
3
4
double a = 3.7;
int toLower, toUpper;   
toLower = (int)floor(a); // округление вниз до ближайшего целого 
toUpper = (int)ceil(a); // округление вверх до ближайшего целого
Цитата Сообщение от GetHelp Посмотреть сообщение
double a = 2.345;
int b = (int)a;
выдает 0
ну это не правда
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
25.11.2013, 18:34  [ТС] 7
Цитата Сообщение от LuxArt Посмотреть сообщение
И оба мимо
У вас нет округления, а только отбрасывание дробной части
а ведь и правда надо еще как то округлять...

Добавлено через 1 минуту
Цитата Сообщение от newbie666 Посмотреть сообщение
так правильно:
C++
1
2
3
4
double a = 3.7;
int toLower, toUpper;   
toLower = (int)floor(a); // округление вниз до ближайшего целого 
toUpper = (int)ceil(a); // округление вверх до ближайшего целого


ну это не правда
мне нужно не округление вниз или вверх, мне нужно округление по правилам математики, т.е. если меньше 0,5 то 0, если больше 0,5 то 1 и т.п. и т.п.

п.с. правда, я проверил
0
newbie666
Заблокирован
25.11.2013, 18:39 8
Цитата Сообщение от GetHelp Посмотреть сообщение
мне нужно не округление вниз или вверх, мне нужно округление по правилам математики
тогда вот так:
C++
1
2
3
double value=4,7906596046;
double rounded_value=floor(value+0.5);
int RESULT = (int) rounded_value;
0
Hunter13ua
46 / 46 / 18
Регистрация: 25.10.2011
Сообщений: 183
25.11.2013, 18:40 9
Я так понимаю, человек просит нечто вроде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <iomanip>
#include <cstdlib>
 
using namespace std;
 
int round(float x)
{
    if ( x < 0 ) x -= 0.5;
        else x += 0.5;
    return (int) x;
}
 
int main()
{
    for(int i=0; i<10; i++){
        float x = ( rand() % 1000 ) / 10.0 - 50.0;
        cout << setw(5) << x << " : "
            << round(x) << endl;
    }
    cin.get();
    return 0;
}
Что не удивительно, т.к. в С++, в отличие от Delphi, нету функции round.
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
25.11.2013, 18:57  [ТС] 10
Цитата Сообщение от Hunter13ua Посмотреть сообщение
Я так понимаю, человек просит нечто вроде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <iomanip>
#include <cstdlib>
 
using namespace std;
 
int round(float x)
{
    if ( x < 0 ) x -= 0.5;
        else x += 0.5;
    return (int) x;
}
 
int main()
{
    for(int i=0; i<10; i++){
        float x = ( rand() % 1000 ) / 10.0 - 50.0;
        cout << setw(5) << x << " : "
            << round(x) << endl;
    }
    cin.get();
    return 0;
}
Что не удивительно, т.к. в С++, в отличие от Delphi, нету функции round.
я конечно ваш код ни хрена не понял, потому что знаю только чистый си, си++ не вкуриваю вообще... но по моему в функции бред какой то...

Добавлено через 2 минуты
Цитата Сообщение от newbie666 Посмотреть сообщение
тогда вот так:
C++
1
2
3
double value=4,7906596046;
double rounded_value=floor(value+0.5);
int RESULT = (int) rounded_value;
это округляет опять таки до ближайшего нижнего разряда, я же сказал мне это не надо... т.е. попробуйте округлить вашим способом например 1,7, получится 1, а должно 2

Добавлено через 1 минуту
вот заготовка ежели что

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <Windows.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
void main()
{
    double a;
    printf("X = ");
    scanf("%lf",&a);
    int b = (int) floor(a+0.5);
    printf("\nRound(X) = %d",b);
    getch();
}
0
Hunter13ua
46 / 46 / 18
Регистрация: 25.10.2011
Сообщений: 183
25.11.2013, 19:00 11
Цитата Сообщение от GetHelp Посмотреть сообщение
потому что знаю только чистый си, си++ не вкуриваю вообще...
Этот отдел форума для С++.
Впрочем, сама функция работает с тем же успехом на Си. По всем математическим правилам. Выдаёт правильный результат типа int.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
 
int round(float x)
{
    if ( x < 0 ) x -= 0.5;
        else x += 0.5;
    return (int) x;
}
 
int main()
{
    int i = 0;
    float x = 0.0;
    for(; i<5; i++){
        scanf("%f", &x);
        printf("%f : %i\n", x, round(x));
    }
    system("pause");
    return 0;
}
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
25.11.2013, 19:08  [ТС] 12
да не будет она работать еще раз вам говорю... что вы хотите добиться прибавлением и вычитанием 0,5? я 0,5 привел просто для примера если что... конкретно попробовал на числе 1,7, выводит 1, а должно 2
0
Hunter13ua
46 / 46 / 18
Регистрация: 25.10.2011
Сообщений: 183
25.11.2013, 19:13 13
GetHelp, Вы ничего не путаете ?
0
Миниатюры
double в int  
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
25.11.2013, 19:16  [ТС] 14
вообще ничего
0
Миниатюры
double в int  
Hunter13ua
46 / 46 / 18
Регистрация: 25.10.2011
Сообщений: 183
25.11.2013, 19:31 15
Это очень странно, мягко говоря О_о..
Могу пояснить логику на примере "1.7" или "-1.7":
1) для чисел больше нуля мы прибавляем к числу 0.5 ( 1.7 + 0.5 = 2.2 )
2) для чисел меньше нуля мы отнимаем от числа 0.5 ( -1.7 - 0.5 = -2.2 )
3) при return мы делаем явное приведение типов к int, что банально отбрасывает дробную часть. ( от 2.2 останется 2; от -2.2 останется -2 ).
Еще примеры:
0.5 -> 0.5 + 0.5 = 1.0 -> 1
-1.2 -> -1.2 - 0.5 = -1.7 -> -1
0.6 -> 0.6 + 0.5 = 1.1 -> 1
5.2 -> 5.2 + 0.5 = 5.7 -> 5
-4.6 -> -4.6 - 0.5 = -5.1 -> -5
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
25.11.2013, 19:34  [ТС] 16
логика мягко говоря странная, а что вы будете делать если у числа больше 1 знака за запятой? скажем 1,75
0
scenotaph
120 / 120 / 47
Регистрация: 29.03.2013
Сообщений: 237
25.11.2013, 19:35 17
GetHelp, Да потому что не 1,75 а 1.75, наверное?
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
25.11.2013, 19:40  [ТС] 18
Цитата Сообщение от scenotaph Посмотреть сообщение
GetHelp, Да потому что не 1,75 а 1.75, наверное?
оо... да вот теперь выдает 2 действительно... хотя я и не понимаю почему оно тогда не чекнуло мне ошибку при считывании если запятая вместо точки на это влияет? и по прежнему логика у функции странная (предыдущий пост)

Добавлено через 2 минуты
даже не 1,75, а например попробуйте взять 1,45 или 1,49 и получите 1, а по правилам математики должно выходить 2...
0
Hunter13ua
46 / 46 / 18
Регистрация: 25.10.2011
Сообщений: 183
25.11.2013, 19:54 19
GetHelp, при 1.45 и 1.49 по правилам должно быть 1. При округлении до целого берётся во внимание только десятичное. Сотые не влияют.
При считывании не выдало ошибку потому, что считало только 1.
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
25.11.2013, 19:56  [ТС] 20
Цитата Сообщение от Hunter13ua Посмотреть сообщение
GetHelp, при 1.45 и 1.49 по правилам должно быть 1. При округлении до целого берётся во внимание только десятичное. Сотые не влияют.
При считывании не выдало ошибку потому, что считало только 1.
ахаха жжете товарищ ! давайте так: вы сейчас идете и открываете учебник математики за 5 (примерно) класс и внимательно читаете как по правилам делать округление...
0
25.11.2013, 19:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2013, 19:56

double и int
double buf = Convert::ToDouble(pole-&gt;Text);//Обьявляем переиенную buf ...

2 int to double
Здравствуйте. Вот такой вопрос. В памяти хранится 2 int числа - рубли и...

float double int
Доброй ночи, препод совсем запарил, то ему не так, то ему не эдак. // 8.2.cpp:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru