Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / переполнение / 15 сообщений из 15, страница 1 из 1
30.07.2007, 12:25
    #34692289
Mr. Orange
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переполнение
Доброго времени суток. Я пишу курсовую (программу в VB). Логику знаю, но вот с воплощением программы в жизнь - проблемы. Во время выполнения циклов (при вводе определенных числ, которые "не нравятся" компилятору) выдается "Ошибка времени выполнения: Переполнение" (да, да, русская версия). Как избежать этого?

Вот кусок кода:

sngTaxRate = 0

vntBD0 = 0

While sngTaxRate <= 100

vntBD1 = sngTaxRate * vntProfit1
vntBD2 = sngTaxRate * vntProfit2
vntBD3 = sngTaxRate * vntProfit3
vntBD4 = sngTaxRate * vntProfit4
vntBD5 = sngTaxRate * vntProfit5
vntBD6 = sngTaxRate * vntProfit6
vntBD7 = sngTaxRate * vntProfit7
vntBD8 = sngTaxRate * vntProfit8
vntBD9 = sngTaxRate * vntProfit9
vntBD10 = sngTaxRate * vntProfit10


For i = 1 To bytYears

vntProfit1 = vntProfit1 * (1 - sngTaxRate / 100) * sngRent1
vntBD1 = vntBD1 + vntProfit1 * (sngTaxRate / 100)

vntProfit2 = vntProfit2 * (1 - sngTaxRate / 100) * sngRent2
vntBD2 = vntBD2 + vntProfit2 * (sngTaxRate / 100)

vntProfit3 = vntProfit3 * (1 - sngTaxRate / 100) * sngRent3
vntBD3 = vntBD3 + vntProfit3 * (sngTaxRate / 100)

vntProfit4 = vntProfit4 * (1 - sngTaxRate / 100) * sngRent4
vntBD4 = vntBD4 + vntProfit4 * (sngTaxRate / 100)

vntProfit5 = vntProfit5 * (1 - sngTaxRate / 100) * sngRent5
vntBD5 = vntBD5 + vntProfit5 * (sngTaxRate / 100)

vntProfit6 = vntProfit6 * (1 - sngTaxRate / 100) * sngRent6
vntBD6 = vntBD6 + vntProfit6 * (sngTaxRate / 100)

vntProfit7 = vntProfit7 * (1 - sngTaxRate / 100) * sngRent7
vntBD7 = vntBD7 + vntProfit7 * (sngTaxRate / 100)

vntProfit8 = vntProfit8 * (1 - sngTaxRate / 100) * sngRent8
vntBD8 = vntBD8 + vntProfit8 * (sngTaxRate / 100)

vntProfit9 = vntProfit9 * (1 - sngTaxRate / 100) * sngRent9
vntBD9 = vntBD9 + vntProfit9 * (sngTaxRate / 100)

vntProfit10 = vntProfit10 * (1 - sngTaxRate / 100) * sngRent10
vntBD10 = vntBD10 + vntProfit10 * (sngTaxRate / 100)

Next i

vntBD = vntBD1 + vntBD2 + vntBD3 + vntBD4 + vntBD5 + vntBD6 + vntBD7 + vntBD8 + vntBD9 + vntBD10


If vntBD > vntBD0 Then
vntBD0 = vntBD
sngTaxRate0 = sngTaxRate
End If

sngTaxRate = sngTaxRate + 0.1

Wend
...
Рейтинг: 0 / 0
30.07.2007, 12:30
    #34692311
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переполнение
какие типы данных
...
Рейтинг: 0 / 0
30.07.2007, 12:30
    #34692313
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переполнение
может поставить Single , Double
...
Рейтинг: 0 / 0
30.07.2007, 12:35
    #34692335
Mr. Orange
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переполнение
типы данных:

Dim intFirstYear As Integer, intLastYear As Integer, sngTaxRate As Single, vntBD As Variant, _
vntBD1 As Variant, vntBD2 As Variant, vntBD3 As Variant, vntBD4 As Variant, vntBD5 As Variant, _
vntBD6 As Variant, vntBD7 As Variant, vntBD8 As Variant, vntBD9 As Variant, vntBD10 As Variant, _
vntProfit1 As Variant, sngRent1 As Single, _
vntProfit2 As Variant, sngRent2 As Single, _
vntProfit3 As Variant, sngRent3 As Single, _
vntProfit4 As Variant, sngRent4 As Single, _
vntProfit5 As Variant, sngRent5 As Single, _
vntProfit6 As Variant, sngRent6 As Single, _
vntProfit7 As Variant, sngRent7 As Single, _
vntProfit8 As Variant, sngRent8 As Single, _
vntProfit9 As Variant, sngRent9 As Single, _
vntProfit10 As Variant, sngRent10 As Single, _
vntBD0 As Variant, sngTaxRate0 As Single

Dim bytYears As Byte
...
Рейтинг: 0 / 0
30.07.2007, 13:08
    #34692470
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переполнение
у меня отработало

какие значения sngRent1 ,....
...
Рейтинг: 0 / 0
30.07.2007, 13:10
    #34692482
Mr. Orange
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переполнение
проценты рентабельности - 100, 110, 140, такого порядка
...
Рейтинг: 0 / 0
30.07.2007, 13:14
    #34692497
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переполнение
всё равно работает

попробуй временно убрать типы переменных и Explicit Option (проверка переменных)
какой VB версия
в какой строчке падает
...
Рейтинг: 0 / 0
30.07.2007, 13:19
    #34692505
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переполнение
vntProfit1 ,... какие значения
...
Рейтинг: 0 / 0
30.07.2007, 16:40
    #34693412
Mr. Orange
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переполнение
падает в разных, в зависимости от значений vntProfitX, sngRentX для отдельного предприятия, но всегда внутри подобных циклов:
vntProfit1 = vntProfit1 * (1 - sngTaxRate / 100) * sngRent1
vntBD1 = vntBD1 + vntProfit1 * (sngTaxRate / 100)

русская версия 6.0 Enterprise,
значения vntProfitX - большие, планируется вводить годовые доходы предприятий в миллионах с десятичной частью,
sngTaxRate - процентная ставка налога, числа от 0 до 100, большой цикл собственно и задуман для определения оптимальной ставки,

кстати, еще вопрос: как организовать проверку введенных пользователем данных, то есть чтобы он мог ввести только числовые значения. и как ограничить кол-во вводимых символов в TextBox? как можно округлить выводимые числа? и почему при вычислениях типа 1000 * 0,2 получается не 200, а число со знаками после запятой?

спасибо, что помогаете.

на всякий случай вставляю весь кусок кода, отвечающий за вычисление оптимального значения sngTaxRate:

Private Sub CalcTaxRate_Click()
Dim intFirstYear As Integer, intLastYear As Integer, sngTaxRate As Single, vntBD As Variant, _
vntBD1 As Variant, vntBD2 As Variant, vntBD3 As Variant, vntBD4 As Variant, vntBD5 As Variant, _
vntBD6 As Variant, vntBD7 As Variant, vntBD8 As Variant, vntBD9 As Variant, vntBD10 As Variant, _
vntProfit1 As Variant, sngRent1 As Single, _
vntProfit2 As Variant, sngRent2 As Single, _
vntProfit3 As Variant, sngRent3 As Single, _
vntProfit4 As Variant, sngRent4 As Single, _
vntProfit5 As Variant, sngRent5 As Single, _
vntProfit6 As Variant, sngRent6 As Single, _
vntProfit7 As Variant, sngRent7 As Single, _
vntProfit8 As Variant, sngRent8 As Single, _
vntProfit9 As Variant, sngRent9 As Single, _
vntProfit10 As Variant, sngRent10 As Single, _
vntBD0 As Variant, sngTaxRate0 As Single

Dim bytYears As Byte

intFirstYear = Val(FirstYear.Text) 'считываем исходные данные (главное окно
intLastYear = Val(LastYear.Text)


vntProfit1 = Val(Industry.Profit1.Text)
sngRent1 = Val(Industry.Rent1.Text) / 100

vntProfit2 = Val(Industry.Profit2.Text)
sngRent2 = Val(Industry.Rent2.Text) / 100

vntProfit3 = Val(Industry.Profit3.Text)
sngRent3 = Val(Industry.Rent3.Text) / 100

vntProfit4 = Val(Industry.Profit4.Text)
sngRent4 = Val(Industry.Rent4.Text) / 100

vntProfit5 = Val(Industry.Profit5.Text)
sngRent5 = Val(Industry.Rent5.Text) / 100

vntProfit6 = Val(Industry.Profit6.Text)
sngRent6 = Val(Industry.Rent6.Text) / 100

vntProfit7 = Val(Industry.Profit7.Text)
sngRent7 = Val(Industry.Rent7.Text) / 100

vntProfit8 = Val(Industry.Profit8.Text)
sngRent8 = Val(Industry.Rent8.Text) / 100

vntProfit9 = Val(Industry.Profit9.Text)
sngRent9 = Val(Industry.Rent9.Text) / 100

vntProfit10 = Val(Industry.Profit10.Text)
sngRent10 = Val(Industry.Rent10.Text) / 100

bytYears = intLastYear - intFirstYear

sngTaxRate = 0

vntBD0 = 0

While sngTaxRate <= 100

vntBD1 = sngTaxRate * vntProfit1
vntBD2 = sngTaxRate * vntProfit2
vntBD3 = sngTaxRate * vntProfit3
vntBD4 = sngTaxRate * vntProfit4
vntBD5 = sngTaxRate * vntProfit5
vntBD6 = sngTaxRate * vntProfit6
vntBD7 = sngTaxRate * vntProfit7
vntBD8 = sngTaxRate * vntProfit8
vntBD9 = sngTaxRate * vntProfit9
vntBD10 = sngTaxRate * vntProfit10


For i = 1 To bytYears

vntProfit1 = vntProfit1 * (1 - sngTaxRate / 100) * sngRent1
vntBD1 = vntBD1 + vntProfit1 * (sngTaxRate / 100)

vntProfit2 = vntProfit2 * (1 - sngTaxRate / 100) * sngRent2
vntBD2 = vntBD2 + vntProfit2 * (sngTaxRate / 100)

vntProfit3 = vntProfit3 * (1 - sngTaxRate / 100) * sngRent3
vntBD3 = vntBD3 + vntProfit3 * (sngTaxRate / 100)

vntProfit4 = vntProfit4 * (1 - sngTaxRate / 100) * sngRent4
vntBD4 = vntBD4 + vntProfit4 * (sngTaxRate / 100)

vntProfit5 = vntProfit5 * (1 - sngTaxRate / 100) * sngRent5
vntBD5 = vntBD5 + vntProfit5 * (sngTaxRate / 100)

vntProfit6 = vntProfit6 * (1 - sngTaxRate / 100) * sngRent6
vntBD6 = vntBD6 + vntProfit6 * (sngTaxRate / 100)

vntProfit7 = vntProfit7 * (1 - sngTaxRate / 100) * sngRent7
vntBD7 = vntBD7 + vntProfit7 * (sngTaxRate / 100)

vntProfit8 = vntProfit8 * (1 - sngTaxRate / 100) * sngRent8
vntBD8 = vntBD8 + vntProfit8 * (sngTaxRate / 100)

vntProfit9 = vntProfit9 * (1 - sngTaxRate / 100) * sngRent9
vntBD9 = vntBD9 + vntProfit9 * (sngTaxRate / 100)

vntProfit10 = vntProfit10 * (1 - sngTaxRate / 100) * sngRent10
vntBD10 = vntBD10 + vntProfit10 * (sngTaxRate / 100)

Next i

vntBD = vntBD1 + vntBD2 + vntBD3 + vntBD4 + vntBD5 + vntBD6 + vntBD7 + vntBD8 + vntBD9 + vntBD10


If vntBD > vntBD0 Then
vntBD0 = vntBD
sngTaxRate0 = sngTaxRate
End If

sngTaxRate = sngTaxRate + 0.1

Wend

TaxRate1.Text = sngTaxRate0

End Sub
...
Рейтинг: 0 / 0
31.07.2007, 09:56
    #34694628
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переполнение
можешь ли дать кусок где есть конкретные большие числа и где проблема с вычислениями

ограничить текст text1.Maxlength=N (0 -без ограничения)

все остальные проверки тоже можно сделать
вопрос что именно нужно проверять (целые дробные отрицательные)

округление есть ряд функций
cint int Round ...
...
Рейтинг: 0 / 0
01.08.2007, 14:02
    #34698044
Mr. Orange
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переполнение
могу, сейчас посмотрю.

vntProfit7 = 12 000 000 000
sngRent7 = 140
bytYears = 30

остальные vntProfit и sngRent - нули.

проверять нужно дробные числа. цель - сделать так, чтобы пользователь мог вводить данные в миллионах рублей с четырьмя знаками дробной части после запятой в качестве исходных. в формате:

10 000 000, 0000

выводить резульаты тоже хочу с округлением до 4х знаков.

то есть максимум - 13 знаков. как длину ограничить, теперь ясно. а можно ограничить число знаков после запятой, число знаков до?
сам я пришел к тому, что придется ограничить кол-во знаков вообще, потом сделать проверку - не больше 10 000 000, 0000, а потом делать округление до 4 знаков после запятой, если их введено больше, но как-то это некрасиво и запутанно((
...
Рейтинг: 0 / 0
02.08.2007, 02:18
    #34699853
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переполнение
я думаю что ты неправильно вводишь числа в текстовое поле (у меня работает с большими числами)

для форматированного ввода использую Microsoft Masked Edit Control (msask32.ocx)
в Components
...
Рейтинг: 0 / 0
02.08.2007, 14:36
    #34701366
Mr. Orange
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переполнение
ну хоть у кого-то работает) я пока работаю над другой частью программы, позже буду этот кусок разбирать.

о, с форматированным вводом разобрался. спасибо.

не подскажете, как можно значения переменных округлить до 4х знаков после запятой?
...
Рейтинг: 0 / 0
02.08.2007, 14:40
    #34701379
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переполнение
format()
...
Рейтинг: 0 / 0
02.08.2007, 16:05
    #34701757
Mr. Orange
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
переполнение
опять занялся переполнением.
ввел данные не через TextBox, а в тексте программы.
vntProfit1 = 1000000#
sngRent1 = 150#
bytYears = 10 (при меньших значениях - 1,2,3,4,5,6,7,8,9 все работает)
остальные vntProfitX, sngRentX - традиционно оставил с нулями.

отладчик выделил вот эту строчку:
Код: plaintext
vntBD1 = sngTaxRate * vntProfit1
судя, по всплывающим сообщениям
vntBD1 = 9,30701430025609E+307,
sngTaxRate = 26,90007
vntProfit1 = 7,53835495504619E+306

вот так. года я правда вводил в TextBox, но там ошибка исключена.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / переполнение / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]