Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > математические операции


Автор: flamingo 4.7.2007, 10:20
подскажите пожалуйста как в vb.net поделить числа с плавающей точкой? такой вопрос можно услышать только от новичка; кем я и являюсь)) элементарное выражение 0.1/0.1 считается не правильно. в обычном vb все считается; а тут нет.  конечно; я открываю  vb.net  не для того чтобы это посчитать, для этого есть калькуляторsmile  перекрутил с типами, с переводами, типа cdec, но не получется.может я не правильно что-то перевожу или есть какая-нить настройка? smile 

Автор: flamingo 4.7.2007, 23:58
меня вчера переклинило smile , в следующий раз напишу что-то умное..
не сидите ночами за кодами, элементарных вещей не замечаешь на n-ый час   smile 

Автор: Naum 5.7.2007, 18:50
Меня, кстати, тоже интересует подобный вопрос (в 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.
Почему так? И как бороться с такой, ИМХО, довольно большой погрешностью?

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

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

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

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

Автор: An124 21.2.2008, 17:31
А не пробывали For i=0 to 60 или есть какая то проблема с этим?

Автор: Exception 22.2.2008, 22:26
При чём тут это?
И вообще, не надо старые темы откапывать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)