首页 > 解决方案 > 关于简单除法和乘法的 VB 算术溢出

问题描述

我在编码应用程序方面还是新手,我正在尝试为我玩的游戏制作一个战斗计算器。我已经完成了大部分用户输入和数学运算,但是一旦达到某个点,我就会发生溢出,即使将我的变量更改为 Int64 也是如此。

故障线是:

    damagedealt1 = dcfleet1hp / darmadahp * armadadmg

举例来说,用户输入船舶数量和船舶类型,软件根据这些输入计算值。以下是与此代码相关的行:

        'Fleet 1'
        fleet1hp = fleet1hp + fleet1hpboost
        fleet1dmg = fleet1dmg + fleet1dmgboost
        cfleet1hp = fleet1hp * fleet1count
        cfleet1dmg = fleet1dmg * fleet1count
        'D Fleet 1'
        dfleet1hp = dfleet1hp + dfleet1hpboost
        dfleet1dmg = dfleet1dmg + dfleet1dmgboost
        dcfleet1hp = dfleet1hp * dfleet1count
        dcfleet1dmg = dfleet1dmg * dfleet1count
        'Fleet 2'
        fleet2hp = fleet2hp + fleet2hpboost
        fleet2dmg = fleet2dmg + fleet2dmgboost
        cfleet2hp = fleet2hp * fleet2count
        cfleet2dmg = fleet2dmg * fleet2count
        'D Fleet 2'
        dfleet2hp = dfleet2hp + dfleet2hpboost
        dfleet2dmg = dfleet2dmg + dfleet2dmgboost
        dcfleet2hp = dfleet2hp * dfleet2count
        dcfleet2dmg = dfleet2dmg * dfleet2count

        'Text Fields Assignation'

        tfleet1.Text = fleet1type
        tfleet1count.Text = fleet1count
        tfleet1hp.Text = cfleet1hp
        tfleet1dmg.Text = cfleet1dmg

        tfleet2.Text = fleet2type
        tfleet2count.Text = fleet2count
        tfleet2hpp.Text = cfleet2hp
        tfleet2dmg.Text = cfleet2dmg

        'Armada HP Calculations'

        armadahp = cfleet1hp + cfleet2hp
        armadadmg = cfleet1dmg + cfleet2dmg
        darmadadmg = dcfleet1dmg + dcfleet2dmg
        darmadahp = dcfleet1hp + dcfleet2hp

        'Individual Fleet DMG Calculation'
        'Broken Code Here'
        damagedealt1 = dcfleet1hp / darmadahp * armadadmg
        damagedealt2 = dcfleet2hp / darmadahp * armadadmg
        damagetaken1 = cfleet1hp / armadahp * darmadadmg
        damagetaken2 = cfleet2hp / armadahp * darmadadmg

以下是变量的定义:

fleet1hp = A single ship in attacking fleet 1's HP
fleet1dmg = A single ship in attacking  fleet 1's DMG
cfleet1hp = The HP combined of all ships in attacking Fleet 1
cfleet1dmg = The DMG combined of all ships in attacking Fleet 1
(then all the same with a 'd' before variable to denote defending fleets)

armadahp = The total HP of all Fleets of attacker
darmadahp = The total HP of all fleets of defender
damagedealt1 = Would be the total damage taken by a single fleet

这里的想法是,受到的伤害等于舰队 hp 除以所有舰队 hp 乘以受到的伤害

这是这条线应该做什么:

damagedealt1 = dcfleet1hp / darmadahp * armadadmg

但是这条线会导致

System.OverflowException: '算术运算导致溢出。'

标签: vb.netmath

解决方案


在线评论。

'As near as I can make out this is how
'you declared your variable
 Dim darmadahp As Int64
 Dim armadadmg As Int64
 Dim dcfleet1hp As Int64
 Dim damagedealt1 As Decimal
 'Always check for division by zero
 If darmadahp * armadadmg <> 0 Then
     'Option Strict (which should always be on) requires the CDec
     damagedealt1 = CDec(dcfleet1hp / (darmadahp * armadadmg))
End If

推荐阅读