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

Ваш аккаунт

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

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

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

Получить дробную часть

10K
29 января 2010 года
s-haman
64 / / 27.03.2007
Здравствуйте у меня возникла проблема, пустяковая на первый взгляд но я уже вторые сутки бьюсь. Суть следующая есть число типа double нужно получить его дробную часть пробовал делать следующими способами
1.double d
2.int i;
3.d=Frac(d)*100;
4.i=d;
второй способ
5.double d
6.long l
7.int i;
8.l=d;
9.i=(d-l)*100;

если я задаю переменную d к примеру d=610.01; то работает программа нормально, но если это же число вычисляется(точнее переводиться) то в результате переменной присваивается ноль, смотрю в дебагере в переменной d перед присвоением значение 0,9903.., когда множитель 100 заменяю на 1000 то присваиваться 9,
для работы использую компилятор CodeGear™ C++Builder® Version 11.0.2709.7128, Подскажите как быть а то я уже незнаю :confused:
8.4K
30 января 2010 года
z0rch
275 / / 02.09.2008
а что если попробовать реализовать через "Число->Строка->обработали строку->число"
сам в билдере не пишу, но вроде бы есть функция IntToStr, наверняка есть и обратная

кстати, подобное вашей проблеме обсуждали здесь
51K
30 января 2010 года
Indian
37 / / 23.12.2009
Это погрешность вещественных чисел, ввиду неточности их представления в памяти компьютера и неизбежности округления.
К тому же число 0.1 в бинарном представлении невозможно представить в конечном виде. Только в приближенном, т.е. 0.099987645.

Поэтому 601.401=6.01401E+2=601.4009997
Вот и округляется до 0. Числа после E, как бы, не зафиксированы, т.к. в конце 0.1.
Поэтому прибавим 0.0000...001
и получим 601.4010000001.(независимо от того, что там было после).
То, что надо.

[highlight=C]#include <stdio.h>
#include <math.h>

int main(){

double num=601.41;//число

num=fmod(num,1); //числа после мантисы, т.е. 0.41
num=num*100+0.00001; //умножим на 100(41.0),
// прибавим 0.00001(41.00001).
printf("%d",(int)num); //число преобразовывается с округлением.

}
[/highlight]
p.s. вместо последней единицы в 601.4010000001 теперь тоже идут девятки.
Могу быть неправ. Поправьте, если что.
1.9K
30 января 2010 года
GreenRiver
451 / / 20.07.2008
А если так? Как-то понадежнее, чем прибавлять цифры наугад.
 
Код:
double d;
int i = (int)Round(Frac(d)*100);
10K
30 января 2010 года
s-haman
64 / / 27.03.2007
Спасибо решил задачу
воспользовался методом предложенным Indian, не очень красиво получилось но для ответа подойдет
пробовал метод GreenRiver но у меня не нашло функцию Round :( у меня подключены следующие хидеры
 
Код:
#include<stdio.h>
#include <fstream.h>
#include<vector>
#include<math.h>

подскажите что надо подключить для возможности округления :rolleyes:
24K
30 января 2010 года
engel65536
50 / / 17.10.2007
Я бы на вашем месте сильно призадумался над одним моментом - в сях порой сложно разобраться, какие приведения типов будут применены к операндам в выражении. Поэтому лично я всегда делаю явное преобразование типов, если я не уверен в хакактере преобразований, производимых компилятором. Тогда код будет таким:
 
Код:
double d;
int i = int( Frac( d )*100.0 + 0.5 );

Здесь явно указано, что умножается double (Frac) на double (100.0), в противном случае у меня компилятор частенько приводил это к int'у. А +0.5 - это как раз и есть правильное округление до целого.
1.9K
31 января 2010 года
GreenRiver
451 / / 20.07.2008
Цитата: s-haman
Спасибо решил задачу
воспользовался методом предложенным Indian, не очень красиво получилось но для ответа подойдет
пробовал метод GreenRiver но у меня не нашло функцию Round :( у меня подключены следующие хидеры
...
подскажите что надо подключить для возможности округления :rolleyes:


Это VCL-функция, в C++ в math.h есть round.
Насколько я понимаю в С не было настоящей функции округления, только округление в большую или меньшую сторону (floor и ceil). Поэтому пользовались хаком, о котором говорит engel65536 (т.е. прибавление 0.5 и округление до меньшего целого).
Сейчас есть round и лучше не усложнять код дополнительными "непонятностями"

16K
22 февраля 2010 года
asmforce
186 / / 05.01.2010
А так не? Многие компиляторы скушали б.

 
Код:
double x = ...
x = x - double((int)x);


Хотя, возможно(?), Вы не это имели ввиду.
1.9K
22 февраля 2010 года
GreenRiver
451 / / 20.07.2008
Цитата: asmforce
А так не? Многие компиляторы скушали б.

 
Код:
double x = ...
x = x - double((int)x);


Хотя, возможно(?), Вы не это имели ввиду.


Функция Frac() делает ровно то, что делает приведенный Вами код, и при этом нет неоднозначности с компиляторами...
Я бы не рискнул в коде писать такое преобразование... кто его знает этот оптимизирующий компилятор... А самое главное она лучше читается человеком =)
Топик стартеру нужно было получить дробную часть в виде целочисленной переменной.

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