首页 > 解决方案 > 对于仅乘法的“int32”类型,值太大或太小

问题描述

我查看了这个主题的很多主题,我知道这个错误是因为该过程涉及的数字大于 int32 支持的数字。

但在我的项目中,所有其他 3 个过程都已成功完成(加 - 减 - 除),但乘法除外。

例如,像 9999999999 这样的大数字可以用前面提到的 3 个进程处理,但乘以它会得到标题中提到的错误。

我正在使用 datatable.compute,这是我的代码:

Try
    Dim myvalue As String = CalculatorText.Text
    Dim calc As New DataTable()
    Dim result = CType(calc.Compute(myvalue, Nothing), Double)
    CalculatorResult.Text = result
Catch ex As Exception
    MsgBox(ex.Message)
End Try

编辑: 我正在使用 datatable.compute 来计算多个进程,例如 (13 + 656 - 54 * 65 / 45),它是用文本框 (calcultorText) 编写的。

当我尝试将相对较小的数字相乘时,会出现以下错误:

在此处输入图像描述

虽然数量很大,但它没有任何问题:

在此处输入图像描述

标签: vb.net

解决方案


我有一个答案给你。首先,您的使用无效。这是滥用机会。然而,它没有任何意义。您已经创建了一个没有任何列的表。然后你调用Compute你传递一些任意数学运算的地方。即使我不知道里面有什么myvalue,我也可以想象,像这样的东西99999999 * 99999999。又是为了什么?

Dim calc As New DataTable()
Dim result = CType(calc.Compute(myvalue, Nothing), Double)

Compute方法是针对某些表操作完成的,如下所示。

Public Shared Sub Main()
    Dim t = New DataTable("x")
    t.Columns.Add("c1", GetType(Integer))

    t.Rows.Add(Integer.MaxValue)
    t.Rows.Add(Integer.MaxValue)
    ' ERROR! but replace column type with GetType(double) and works
    Dim res = t.Compute("Sum(c1) * 9999999999", Nothing)
    Console.WriteLine(res)
End Sub

正如你在上面看到的,如果你有一个定义了数据类型的列,你可以计算具有大数值输出的数学表达式。但是你所做的,你没有计算表表达式,你DataTable在错误的应用程序中使用了能力。

您可能应该编写一个解析器并将值加载到变量中,这样就可以了x + y。其实这个问题之前已经回答过了

一个有点hacky的解决方法可以是这个

t.Columns.Add("c1", GetType(double)) ' define a column
t.Rows.Add(1) ' Add "1" to a single row
' And multiply your expression by 1 as result of SUM, always
Dim res As Double = CType(t.Compute("Sum(c1) * 999999999999 * 9999999999", Nothing), Double)

那可行


推荐阅读