|
|
|
переполнение
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Я пишу курсовую (программу в 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2007, 12:25 |
|
||
|
переполнение
|
|||
|---|---|---|---|
|
#18+
может поставить Single , Double ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2007, 12:30 |
|
||
|
переполнение
|
|||
|---|---|---|---|
|
#18+
типы данных: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2007, 12:35 |
|
||
|
переполнение
|
|||
|---|---|---|---|
|
#18+
у меня отработало какие значения sngRent1 ,.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2007, 13:08 |
|
||
|
переполнение
|
|||
|---|---|---|---|
|
#18+
проценты рентабельности - 100, 110, 140, такого порядка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2007, 13:10 |
|
||
|
переполнение
|
|||
|---|---|---|---|
|
#18+
всё равно работает попробуй временно убрать типы переменных и Explicit Option (проверка переменных) какой VB версия в какой строчке падает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2007, 13:14 |
|
||
|
переполнение
|
|||
|---|---|---|---|
|
#18+
vntProfit1 ,... какие значения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2007, 13:19 |
|
||
|
переполнение
|
|||
|---|---|---|---|
|
#18+
падает в разных, в зависимости от значений 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2007, 16:40 |
|
||
|
переполнение
|
|||
|---|---|---|---|
|
#18+
можешь ли дать кусок где есть конкретные большие числа и где проблема с вычислениями ограничить текст text1.Maxlength=N (0 -без ограничения) все остальные проверки тоже можно сделать вопрос что именно нужно проверять (целые дробные отрицательные) округление есть ряд функций cint int Round ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2007, 09:56 |
|
||
|
переполнение
|
|||
|---|---|---|---|
|
#18+
могу, сейчас посмотрю. vntProfit7 = 12 000 000 000 sngRent7 = 140 bytYears = 30 остальные vntProfit и sngRent - нули. проверять нужно дробные числа. цель - сделать так, чтобы пользователь мог вводить данные в миллионах рублей с четырьмя знаками дробной части после запятой в качестве исходных. в формате: 10 000 000, 0000 выводить резульаты тоже хочу с округлением до 4х знаков. то есть максимум - 13 знаков. как длину ограничить, теперь ясно. а можно ограничить число знаков после запятой, число знаков до? сам я пришел к тому, что придется ограничить кол-во знаков вообще, потом сделать проверку - не больше 10 000 000, 0000, а потом делать округление до 4 знаков после запятой, если их введено больше, но как-то это некрасиво и запутанно(( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 14:02 |
|
||
|
переполнение
|
|||
|---|---|---|---|
|
#18+
я думаю что ты неправильно вводишь числа в текстовое поле (у меня работает с большими числами) для форматированного ввода использую Microsoft Masked Edit Control (msask32.ocx) в Components ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 02:18 |
|
||
|
переполнение
|
|||
|---|---|---|---|
|
#18+
ну хоть у кого-то работает) я пока работаю над другой частью программы, позже буду этот кусок разбирать. о, с форматированным вводом разобрался. спасибо. не подскажете, как можно значения переменных округлить до 4х знаков после запятой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 14:36 |
|
||
|
переполнение
|
|||
|---|---|---|---|
|
#18+
опять занялся переполнением. ввел данные не через TextBox, а в тексте программы. vntProfit1 = 1000000# sngRent1 = 150# bytYears = 10 (при меньших значениях - 1,2,3,4,5,6,7,8,9 все работает) остальные vntProfitX, sngRentX - традиционно оставил с нулями. отладчик выделил вот эту строчку: Код: plaintext vntBD1 = 9,30701430025609E+307, sngTaxRate = 26,90007 vntProfit1 = 7,53835495504619E+306 вот так. года я правда вводил в TextBox, но там ошибка исключена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 16:05 |
|
||
|
|

start [/forum/topic.php?fid=60&gotonew=1&tid=2163651]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
136ms |
get topic data: |
11ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 234ms |
| total: | 485ms |

| 0 / 0 |
