Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 02.06.2013, 14:40   #1
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию [вопрос] Как откинуть знаки после запятой

Доброго времени суток.
Помогите, если время есть. В общем столкнулся с траблой следующего вида. Есть число 23,2345001, как отбросить лишние 001? Я пробовал умножать, переводить в int и обратно в float c помощью деления. Ну и получилось не точное число (н-р: 23,23449). Как это побороть? Пока нагуглил только ответы, как вывести это дело на экран, но мне это не подходит, потому что значение ещё будет участвовать в вычислениях.
Заранее спасибо.
Tahoma вне форума Ответить с цитированием
Старый 02.06.2013, 14:50   #2
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

Если я правильно понял, то нужно оставить 4 знака после запятой. Над этим делом можно как нибудь поизвращатся, например умножить на 10000 и у нас останется 232345,001 , далее перевести в int, тем самым округлив всё нафиг, потом перевести обратно в float и разделить на те же 10000. В результате мы должны получить 23,234500, но это лишь теория и догадки
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Старый 02.06.2013, 15:09   #3
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию

Цитата:
Сообщение от Че Гевара Посмотреть сообщение
Если я правильно понял, то нужно оставить 4 знака после запятой. Над этим делом можно как нибудь поизвращатся, например умножить на 10000 и у нас останется 232345,001 , далее перевести в int, тем самым округлив всё нафиг, потом перевести обратно в float и разделить на те же 10000. В результате мы должны получить 23,234500, но это лишь теория и догадки
Ага... это тоже мне пришло в голову, но счет почему-то получается не точный. Хотя в теории должно было бы сработать.
Tahoma вне форума Ответить с цитированием
Старый 02.06.2013, 16:14   #4
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

Долго бродил я по просторам всемирной паутины, на сайты заморские забредал(самому интересно стало), да и чего только не пробовал, всё без толку, как вдруг набрёл на такую родную math.h в википедии и нашёл в ней очень интересную вункцию, которая округляет до целого в формате float. Применил её и заработало
Снимок.jpg
А вот собственно и сам код
Код:
#include<conio.h>
#include<stdio.h>
#include<math.h>
main()
{
    float i = 23.2345001;//в этом числе компилятор сам убирает один ноль(у float 6 знаков после точки) и получается 23.234501
    i *= 10000;//превращаем в 232345.01
    i = nearbyint(i);//округляем до 232345.000000
    i /= 10000;//возвращаем 23.234500
    printf("%f",i);
    getch();
}
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Старый 02.06.2013, 17:19   #5
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию

Спасибо, но мой VS 2012 не нашел эту функцию. Хотя в MSDN написано, что надо подгрузить amp_math.h. Попробую разобраться. Спасибо
Tahoma вне форума Ответить с цитированием
Старый 02.06.2013, 17:36   #6
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

Попробуйте cmath.h вместо math.h, может прокатит
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Старый 02.06.2013, 19:24   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Используйте тип double вместо float, он более точный, так что погрешность будет значительно меньше. Совсем от нее избавиться не получится, т.к. особенности двоичной арифметики позволяют точно представлять только числа, равные сумме степеней двоек (в том числе, степеней числа 1/2). К примеру, даже число 0,3 будет представлено как-нибудь вроде 0,2999999998. Единственный способ избавиться от неточностей совсем - реализовать какую-нибудь символьную арифметику (например, работающую с рациональными дробями и радикалами), но не думаю, что в вашем случае оно будет того стоить.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как удалить знаки после запятой ukrman Microsoft Office Excel 11 03.02.2012 17:22
Как в программе отсеч лишние знаки после запятой? egor088 Общие вопросы Delphi 40 15.02.2011 01:17
откинуть текст после названия домена designer999 Общие вопросы Delphi 12 20.04.2010 18:18
Разделение чисел на до запятой и после запятой msser Microsoft Office Excel 8 23.10.2009 11:57
знаки после запятой RiF Помощь студентам 10 16.12.2008 21:04