Код VBA My Tax Rate сообщает об ошибке переполнения при попытке расчета подоходного налога - PullRequest
0 голосов
/ 24 февраля 2019
Option Explicit
Option Base 1

'I am unsure why the code is not functioning correctly these are global variables that can be used throughout the module1

Public taxRates As Integer
Public grossIncome As Integer

Sub Main()

Call GetGrossIncome
Call GetTaxRates
Call CalculateTax

End Sub

Function GetGrossIncome()

'User enters their gross income

grossIncome = InputBox("Please enter your gross income ")

'if an error the user program will continue as this works fine I added this just in case

On Error Resume Next
On Error GoTo 0

'goes back to the main to execute the next line function

End Function

'This is where I am most likely getting the error from. I cannot seem to figure out why that is the case as I thought I wrote the code correctly.

Function GetTaxRates()
Select Case grossIncome

'this case is for highest tax bracket

Case Is >= 600001
    taxRates = ((19050 * 0.1) + (58349 * 0.12) + _
    (87599 * 0.22) + (149999 * 0.24) + (84999 * 0.32) + _
    (199999 * 0.35) + ((grossIncome - 600000) * 0.37))

'this case is for second highest tax bracket

Case Is >= 400001
    taxRates = ((19050 * 0.1) + (58349 * 0.12) + _
    (87599 * 0.22) + (149999 * 0.24) + (84999 * 0.32) + _
    ((grossIncome - 400000) * 0.35))

'this case is for third highest tax bracket

Case Is >= 315001
    taxRates = ((19050 * 0.1) + (58349 * 0.12) + _
    (87599 * 0.22) + (149999 * 0.24) + ((grossIncome - 315000) * 0.32))

'this case is for fourth highest tax bracket

    Case Is >= 165001
    taxRates = ((19050 * 0.1) + (58349 * 0.12) + _
    (87599 * 0.22) + ((grossIncome - 165000) * 0.24))

'this case is for fifth highest tax bracket

Case Is >= 77401
    taxRates = ((19050 * 0.1) + (58349 * 0.12) + _
    ((grossIncome - 77400) * 0.22))

'this case is for sixth highest tax bracket

Case Is >= 19051
    taxRates = ((19050 * 0.1) + ((grossIncome - 19050) * 0.12))

'this case is for lowest tax bracket

Case Else
    taxRates = (grossIncome * 0.1)

End Select

End Function

'displays message box type of income tax

Function CalculateTax()

'This displays their income tax due
MsgBox " Income Tax due for a taxable income of " & grossIncome & " is " & taxRates

End Function

1 Ответ

0 голосов
/ 24 февраля 2019

Взято из Википедии:

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

Вы определяете Public taxRates As Integer.Тип Integer имеет ограничения -32,768 to 32,767.

Однако, если я воспользуюсь этой операцией (думаю, у меня тоже возникнет такая же проблема):

Case Is >= 600001
    taxRates = ((19050 * 0.1) + (58349 * 0.12) + _
    (87599 * 0.22) + (149999 * 0.24) + (84999 * 0.32) + _
    (199999 * 0.35) + ((grossIncome - 600000) * 0.37))

..и я заменяю grossIncome на 600001 (минимальный лимит, чтобы попасть внутрь), я получаю значение 161,378.12, которое намного больше верхнего предела Integer.

Следовательно, вы получаетеoverflow.Также обратите внимание, что Integer не имеет десятичных дробей, тогда как taxRates, скорее всего, будет иметь десятичные дроби, исходя из их соотношения.

Ваше решение состоит в том, чтобы объявить Public taxRates As Double.Я также предлагаю вам прочитать эту вики-страницу, описывающую все типы данных и их ограничения .

Кроме того, grossIncome должно быть Decimal (иначе у вас возникнет та же проблема).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...