vb.net - 对于仅乘法的“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) 编写的。
当我尝试将相对较小的数字相乘时,会出现以下错误:
虽然数量很大,但它没有任何问题:
解决方案
我有一个答案给你。首先,您的使用无效。这是滥用机会。然而,它没有任何意义。您已经创建了一个没有任何列的表。然后你调用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)
那可行
推荐阅读
- c# - 在 C# 中将日期时间格式 04-08-2021 00:00:00 转换为字符串 '08/04/2021'
- solr - 如何在 Solr 独立托管模式模式下为 Solr 核心上传/替换 Solr 资源文件?
- javascript - 尝试在 Typescript 中创建 Dictionary 对象时出错
- python-3.x - 对 numpy 数组使用多进程或多线程
- gitlab - Jenkins 管道:结帐不保留 Git 时间戳
- scala - Scala中的通用递归类型
- python - 将所有 tkinter GUI 保存为 PDF
- reactjs - 在过滤函数 React 中使用对象数组时获取一个空数组
- sql - 如何使用 postgreSQL 产生循环移位
- java - 通过从 Repository 方法返回 Page<> 生成的计数查询在 org.hibernate.QueryException 上崩溃:意外字符:'`'