Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> округление числа типа double 
V
    Опции темы
IGV
Дата 29.4.2009, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 1.4.2008

Репутация: 1
Всего: 2



Имеется PropertyGrid, в кот отображаются значения свойств класс.
Свойства имеют тип double, при отображаении числа в propertygrid'е, число отображается с длинным "хвостом" дробной части.
Как оставить только 2 знака после запятой?
метод Round, округляет, но хвост всё равно остается. Мне нужно просто отбросить все знаки после 2 знака после запятой.
К decimal не очень хочется переходить, ибо придется очень много править
PM MAIL ICQ   Вверх
-Mikle-
Дата 29.4.2009, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Скриншот того, что остается после Round... Очень интересно...


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
IGV
Дата 29.4.2009, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 1.4.2008

Репутация: 1
Всего: 2



я так понял, что это проблема с тем, что double хранится не в десятичной системе
после округления может оставать что-нибудь типа этого 1,210009999987, либо округление нормально проходит.
В общем всё-таки перезжаю на decimal, сделал так
Код

Decimal.Truncate((decimal)doubleNumber * 100) / 100;


Это сообщение отредактировал(а) IGV - 29.4.2009, 09:32
PM MAIL ICQ   Вверх
Partizan
Дата 29.4.2009, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



IGV, Math.Truncate и не нужны никакие переезды на decimal...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
-Mikle-
Дата 29.4.2009, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Используй Math.Truncate(...)

Добавлено через 24 секунды
Partizan, опередил smile


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
IGV
Дата 29.4.2009, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 1.4.2008

Репутация: 1
Всего: 2



я пробовал, при делении на 100, опять получается длинный хвост!
PM MAIL ICQ   Вверх
Экскалупатор
Дата 29.4.2009, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



я так понял вам нужно вот это:
Код

double s = schet_rezult * Percent;
                schet_rezult += s + DopVklad;
                result.AppendLine();
                result.AppendFormat("{0} месяц: проценты составили: {1:#.####}, вклад: {2}, итого: {3:#.####}", i, s, DopVklad, schet_rezult);

... это кусок из кода по этому переделывать не стал, но думаю принцип ясен - {1:#.####} - задает количество знаков после запятой

Добавлено через 6 минут и 35 секунд
хотя может я все таки не так понял задачу...
PM MAIL ICQ   Вверх
-Mikle-
Дата 29.4.2009, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Цитата(IGV @  29.4.2009,  12:30 Найти цитируемый пост)
Decimal.Truncate((decimal)doubleNumber * 100) / 100;

Цитата(IGV @  29.4.2009,  12:48 Найти цитируемый пост)
я пробовал, при делении на 100, опять получается длинный хвост! 


Понял я в чем твой трабл.

Ты сначала округляешь, а потом на 100 делишь... плохо это... дели сначала на 100, а потом округляй:

Код

    double value = ..................;
    value = Math.Round(value / 100, 2);

Вот с этим кодом проблемы хвостов нет!



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
IGV
Дата 29.4.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 1.4.2008

Репутация: 1
Всего: 2



Цитата(-Mikle- @  29.4.2009,  10:33 Найти цитируемый пост)
value = Math.Round(value / 100, 2);

мне само значение не нужно делить на 100
PM MAIL ICQ   Вверх
DVariuS
Дата 29.4.2009, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 10.2.2009
Где: Ukraine

Репутация: 5
Всего: 8



IGV, запость участок кода, в котором ты выполняешь преобразование - будет более понятно где ошибка и тебе быстрее помогут  smile 
PM MAIL   Вверх
-Mikle-
Дата 29.4.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Сделал такой класс:
Код

        class Test
        {
            double val;
            public double Val
            {
                get { return val; }
                set
                {
                    val = value;
                    RoundedVal = Math.Round(val, 2);
                }
            }

            public double RoundedVal { get; set; }
        }


Поставил PropertyGrid и Button на форму и написал:
Код

        Random rnd = new Random();
        Test test = new Test();
        private void button1_Click(object sender, EventArgs e)
        {
            test.Val = rnd.NextDouble();
            propertyGrid1.SelectedObject = test;
        }


Нажимал, нажимал и еще раз нажимал на кнопку, но ни разу не вышло хвоста! Хвост выходил только(!), если после округления я делил число на 100. Потому я и подумал что ты делишь. Но Round работает безотказно у меня.

Давай сюда свой код, будем смотреть!



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.2878 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.