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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> математические операции, деление с плавающей точкой 
V
    Опции темы
flamingo
Дата 4.7.2007, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



подскажите пожалуйста как в vb.net поделить числа с плавающей точкой? такой вопрос можно услышать только от новичка; кем я и являюсь)) элементарное выражение 0.1/0.1 считается не правильно. в обычном vb все считается; а тут нет.  конечно; я открываю  vb.net  не для того чтобы это посчитать, для этого есть калькуляторsmile  перекрутил с типами, с переводами, типа cdec, но не получется.может я не правильно что-то перевожу или есть какая-нить настройка? smile 
PM MAIL   Вверх
flamingo
  Дата 4.7.2007, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



меня вчера переклинило smile , в следующий раз напишу что-то умное..
не сидите ночами за кодами, элементарных вещей не замечаешь на n-ый час   smile 
PM MAIL   Вверх
Naum
Дата 5.7.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

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



Меня, кстати, тоже интересует подобный вопрос (в VB6 такого точно не было).
Допустим, у нас есть win-форма, на ней кнопка. Добавляем в обработчик клика по кнопке следующий код
Код

Dim d As Double = 0
Dim i As Integer
For i = 1 To 60
   d += 0.1
   Me.Text = d
Next

Запускаем. Нажимаем на кнопочку. И в заголовке формы видим не 6 (как ожидалось), а 5,99999999999999.
Почему так? И как бороться с такой, ИМХО, довольно большой погрешностью?


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
Дрон
Дата 7.7.2007, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Naum, это уже, наверно, много раз обсуждалось.
Но в кратце: тип double (а тем более single) действительно имеет погрешность, появляющуюся при переводе из внутреннего формата в десятичный (тот который мы читаем). Почти как с бесконечными дробями вроде 1/3, которые нельзя точно представить в десятичном виде.
Это связано с тем, что в машине существует конечное множество значений допустимых для double на каком-то интервале, а в математике считается, что вещественных чисел бесконечное много на любом интервале.

Ну и, наконец, особенно хорошо эта погрешность действительна заметна после вычислений в циклах, так как уже изначально тот 0.1, который ты суммируешь, получает некоторую погрешность при переводе в double и там она накапливается. Из-за всего этого возникает неприятная проблема при сранении чисел с плавающей точкой на равенство. В твоём примере сравнение
Код
If d = 6 Then ...

по идее уже не сработает.

Вывод?
1) Быть аккуратным с плавающей точкой.
2) Если нужны точные вычисления, то использовать тип decimal (вроде в VB6 был подобный тип под названием money или как-то так)


--------------------
Да. Именно так.
PM   Вверх
An124
  Дата 21.2.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А не пробывали For i=0 to 60 или есть какая то проблема с этим?
PM MAIL   Вверх
Exception
Дата 22.2.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



При чём тут это?
И вообще, не надо старые темы откапывать.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

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

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


 




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


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

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