2016-05-31 1 views
0

У меня есть выражение строка:Как использовать Compute для расчета общей с двойной DATATYPE

dim str as string = "999999999 * 999999999" 

Я использую DataTable.Compute для расчета:

dim dt as new datatable 
dim result as double = 0 
result = cdbl(dt.Compute(str)) 

И я получаю ошибку:

Value is either too large or too small for Type 'Int32'. 

Как я могу управлять типом данных результата в этом случае?


Эта функция работает как калькулятор Windows. Код так запутать, но это работает :)

'input = "999,999,999 x 888,888,888 + 112,365 ÷ 15 − 987,653" 
Public Shared Function strCalc(ByVal input As String) As String 
    If input.Substring(input.Length - 1, 1) = " " Then input = input.Substring(0, input.Length - 3) 
    input = input.Replace("−", "-").Replace("x", "*").Replace("÷", "/").Replace(",", "") 
    Dim temp As Double = 0 
    Dim arr() As String = input.Split(" ") 

    If arr.Length > 1 Then 
     temp = New DataTable().Compute(If(arr(0).Contains("."), arr(0), arr(0) & ".0") & " " & arr(1) & " " & 
             If(arr(2).Contains("."), arr(2), arr(2) & ".0"), "") 
     If arr.Length > 3 Then 
      For i As Integer = 3 To arr.Length - 1 Step 2 
       temp = New DataTable().Compute(temp & " " & arr(i) & " " & 
               If(arr(i + 1).Contains("."), arr(i + 1), arr(i + 1) & ".0"), "") 
      Next 
     End If 
     Return temp 
    End If 
    Return input 
End Function 
+0

Во-первых, вы можете сделать это в одной строке, то есть 'Dim результат = CDbl (New DataTable() .Compute (ул)) '. Что касается вопроса, я бы предположил, что использование '999999999.0' будет работать. – jmcilhinney

+0

Для меня API вычислений ожидает еще один параметр с именем filter. Почему ваш код даже компилируется? – RBT

+0

Или проще: 'Dim result As Double = 999999999R * 999999999R'. «R» - это символ типа «Double» в визуальном базовом – Fabio

ответ

1

выполнение обрабатывает ваше выражение 999999999 * 999999999 как произведение двух целых чисел, и пытается вернуть его как объект, который является типом возвращаемого Compute API. Результат умножения этих чисел приводит к очень большому значению, которое пересекает максимальное значение, которое может быть сохранено в переменной типа данных int (System.Int32).

Это приводит к исключению арифметического переполнения. Чтобы дать подсказку во время выполнения, так что он рассматривает выражение как умножение двух double чисел, пожалуйста, используйте следующий код:

dim str as string = "999999999.0 * 999999999.0" 
+1

'999999999.0 * 999999999' или' 999999999 * 999999999.0' также в порядке. – Ajay

+0

Да. Правый @ Аджай. Время выполнения обновляет выражение на основе операнда с большей точностью. Float имеет более высокую точность, чем целочисленный тип данных. Поэтому обновление одного из двух операндов до float приведет к обновлению всего выражения как умножение двух операндов с плавающей запятой. – RBT

Смежные вопросы