Страница: 1 | 2 |
Вопрос: vbNet. Ошибка при выводе результата
Добавлено: 25.08.09 20:28
Автор вопроса: Lara
Делаю программу "калькулятор" в vbNet. Все вроде нормально работает, но при умножении константы pi на себя результат выдает 9! Должно ведь быть дробное число! Константу определила - тип Double. Не понимаю... Хелп!
P.S. Если умножаю обычные десятичные дроби, то и результат - вещественное число. Глючит именно pi...
Ответы
Всего ответов: 22
Номер ответа: 1
Автор ответа:
Дмитрий Юпатов
Вопросов: 4
Ответов: 457
Web-сайт:
Профиль | | #1
Добавлено: 25.08.09 20:45
Странно:
возвращает 9,86960440108936
Номер ответа: 2
Автор ответа:
Aston
ICQ: 214-179-991
Вопросов: 42
Ответов: 272
Профиль | | #2
Добавлено: 25.08.09 21:18
Во что возвращает значение, может проблема в том куда возвращает. По идее должно работать всё нормально.
Номер ответа: 3
Автор ответа:
Lara
Вопросов: 2
Ответов: 11
Профиль | | #3
Добавлено: 25.08.09 21:20
Возвращает в метку значение 9, а не 9,86960440108936
Может какое-то свойство метки отвечает за формат выводимого числа?
Номер ответа: 4
Автор ответа:
Сергей
Вопросов: 1
Ответов: 8
Web-сайт:
Профиль | | #4
Добавлено: 25.08.09 21:27
Может сохранить Это Pi в отдельную константу да и все
Может я я чего-то не понимаю...
Номер ответа: 5
Автор ответа:
Lara
Вопросов: 2
Ответов: 11
Профиль | | #5
Добавлено: 25.08.09 22:02
Да я так и сделала. Вот:
Const pi As Double = 3.14159265358979
Код кнопки "умножить":
Private Sub Proizved_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Proizved.Click
Ravno.Tag = Val(Label1.Text)
deystvie = "произведение"
Label1.Text = ""
End Sub
При нажатии на "равно" с помощью оператора Select Case выбираю нужное действие и
Select Case deystvie
Case "сумма"
Resalt = Ravno.Tag + Val(Label1.Text)
Case "разность"
Resalt = Ravno.Tag - Val(Label1.Text)
...
End Select
Label1.Text = Resalt
Вроде все верно...
Номер ответа: 6
Автор ответа:
Lara
Вопросов: 2
Ответов: 11
Профиль | | #6
Добавлено: 25.08.09 22:04
Небольшая ошибка. Забыла в операторе Select Case
записать строчку для произведения..
Case "произведение"
Resalt = Ravno.Tag * Val(Label1.Text)
Ну, в общем и так понятно)))
Номер ответа: 7
Автор ответа:
Lara
Вопросов: 2
Ответов: 11
Профиль | | #7
Добавлено: 25.08.09 22:07
А как быть с суммой, разностью, возведением в любую степень и т.д.? Работать ведь должно и при обычном pi+pi.... а не работает...
Номер ответа: 8
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #8
Добавлено: 25.08.09 22:16
В качестве разделителя дробной части функция Val разпознает только точку! Когда вы записываете число в метку,оно форматируется в зависимости от региональных настроек.. а поскольку у вас наверняка стоит русская локаль, то туда записывается число с запятой и Val при считывании этого числа натыкаясь на запятую тупо отбрасывает дробную часть не считая ее числом.. отсюда вы и получаете результат 9.. Изуйчайте типы данных и приведение к необходиомум типу..
Номер ответа: 9
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #9
Добавлено: 25.08.09 22:18
А вообще почаще обращайтесь к документации... rtfm
http://msdn.microsoft.com/ru-ru/library/k7beh1x9.aspx
Номер ответа: 10
Автор ответа:
Lara
Вопросов: 2
Ответов: 11
Профиль | | #10
Добавлено: 25.08.09 22:21
Неправда ваша, я знаю, что разделитель - это точка! И константу ввожу с точкой. А вот фразу "поскольку у вас наверняка стоит русская локаль, то туда записывается число с запятой " я не поняла. Поясните, пожалуйста....
Номер ответа: 11
Автор ответа:
Сергей
Вопросов: 1
Ответов: 8
Web-сайт:
Профиль | | #11
Добавлено: 25.08.09 22:33
Как сказать то ...
ну вот
"Число с запятой" = val("Число с точкой"
Номер ответа: 12
Автор ответа:
Сергей
Вопросов: 1
Ответов: 8
Web-сайт:
Профиль | | #12
Добавлено: 25.08.09 22:35
Видимо EROS говорил(а) про это
Номер ответа: 13
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #13
Добавлено: 25.08.09 22:41
Суть этой фразы в том, что вы в каком то месте с числом работаете как со строкой.. и при переводе из числа в строку и обратно теряете дробную часть..
Если вы попробуете выполнить такой код:
То скорее всего вы там вместо точки увидите запятую.. И если это так, то при попытке через Val снова сделать число, вы потеряете дробную часть.. (я так думаю)
Номер ответа: 14
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #14
Добавлено: 25.08.09 22:45
А вообще я бы рекомендовал вам отказаться от Val и воспользоваться стандартными функциями типа Double.Parse или CDbl что больше вам нравиться... тогда вы наверняка избежите ошибки преобразования..
Номер ответа: 15
Автор ответа:
Lara
Вопросов: 2
Ответов: 11
Профиль | | #15
Добавлено: 25.08.09 22:47
Если записать строку
3,14159265358979 = Val(3.14159265358979)
то программа сообщает о синтаксической ошибке.
Я поняла, в чем проблема: когда я нажимаю кнопку ввода pi, тот несмотря на то, что константа эта определна с точкой, в текстовое поле число появляется с запятой!!!
Вот только, как решить эту проблему?