【问题标题】:Data.DataTable().Compute not evaluating big number in vb.netData.DataTable().Compute 不评估 vb.net 中的大数
【发布时间】:2021-01-11 18:17:07
【问题描述】:

我想评估这个表达式

IIF((1602 * 2136 * 1601) <> 0, 100 * ((1601 * 2133 *  1601)/(1602 * 2136 * 1601)), -1),

我遇到了异常->

System.OverflowException: '值对于类型'Int32'来说太大或太小。'

newFormulaString = IIF((1602 * 2136 * 1601) <> 0, 100 * ((1601 * 2133 *  1601)/(1602 * 2136 * 1601)), -1)

OutputDtbl(i - 1) = Convert.ToInt64(New Data.DataTable().Compute(newFormulaString, Nothing))

【问题讨论】:

标签: .net vb.net datatable


【解决方案1】:

expressio0n 1602 * 2136 * 1601 超过 50 亿。 Int32 的最大值约为 20 亿。

使用Long 类型而不是IntegerLong 的最大值为 ~ 9.2E+18。您可以使用L 指定Long 号码。例如。 1602L。如果您在实际表达式中使用变量,则可以通过将它们与1L 相乘来将它们转换为Long,如1L * x * y * z

【讨论】:

  • 非常感谢,但我得到 1602 作为字符串,我尝试了这个 Dim offSetvalue As Long = CLng(values(5, foundCol) - values(1, foundCol)),我无法为 1602 附加 L,你能帮我解决这个问题吗
  • 尝试与 1L 相乘,但对我不起作用
  • 这将有助于查看您的真实代码。 “L”仅适用于 VB 代码,不适用于转换为 Long 的字符串,例如与CLng。在进行数学运算之前使用 CLng 转换字符串应该可以工作。
【解决方案2】:

我会重写 FWIW

    ' rewritten
    '  change variable names
    Const num1 As Long = 1602L * 2136L * 1601L
    Const num2 As Long = 1601L * 2133L * 1601L
    Const divNums As Long = num2 \ num1

    Dim rslt As Long = If(num1 <> 0L, 100L * divNums, -1L)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多