Проблема с математическим выражением - PullRequest
2 голосов
/ 20 апреля 2011

При использовании экспоненциального оператора в C # компилятор сообщал: " Оператор ^ не может быть применен к операндам типа int и double. " В то время как то же самое компилировалось без каких-либо ошибок в VB.NET.

//C# Code, error while compiling
decimal i = 1 * (1 + 1) + 75 * 1 * (1 + 1) ^ 0.5;

'VB.NET Code. Compiled without errors 
Dim i as decimal = 1 * (1 + 1) + 75 * 1 * (1 + 1) ^ 0.5 'outputs 108.066017177982 as expected

Чтобы обойти ошибку C #, я обновил код для использования Math.Pow (), который выдавал неправильный вывод

decimal i = 1 * (1 + 1) + 75 * 1 * (1 + 1);
i = (decimal)Math.Pow((double)i, 0.5);
Console.WriteLine(i); //Outputs 12.328828005938 instead of 108.0660172

//Next i changed the datatype to double, still same results
double i = 1 * (1 + 1) + 75 * 1 * (1 + 1);
i = Math.Pow(i, 0.5);
Console.WriteLine(i); //Outputs 12.328828005938 instead of 108.0660172

При выполнении той же формулы в Excel выдает 108.0660172, как и ожидалось,= 1 * (1 +1) + 75 * 1 * (1 + 1) ^ 0,5

Пожалуйста, помогите мне решить эту проблему.

Ответы [ 4 ]

8 голосов
/ 20 апреля 2011

В C # ^ не является оператором питания.Это оператор Xor.Вот документация об этом: ^ Оператор (C # Reference)

Что касается причины, по которой он оценивается в 12.32, так это 1 * (1 + 1) + 75 * 1 * (1+ 1) равно 152, а sqrt (152) - около 12,32.

С другой стороны, в VB и Excel оно оценивается как 1 * (1 + 1) + 75 * 1 * sqrt (2)108,06.В C # вы можете выразить это как double i = 1 * (1 + 1) + 75 * 1 * Math.Pow((1 + 1),0.5);

5 голосов
/ 20 апреля 2011

Сила 0,5 равна квадратному корню.

Квадратный корень вашего i (2 + 150 = 152) на самом деле составляет ~ 12,33.

Pow () возвращает правильный ответ, обязательно используйте скобки над тем, что вы хотите включить.

4 голосов
/ 20 апреля 2011

Ваш расчет VB будет осуществляться следующим образом:

(1 * (1 + 1)) + (75 * 1 * ((1 + 1) ^ 0.5));

Чтобы получить тот же результат в C #, вы должны записать его как:

1 * (1 + 1) + 75 * 1 * Math.Pow((1 + 1),0.5);
1 голос
/ 20 апреля 2011

Вы применили квадратный корень ко всему выражению.

Попробуйте вместо этого:

double lastPart = (1 + 1);
double sqrt = Math.Pow(lastPart, 0.5);
double i = 1 * (1 + 1) + 75 * 1 * sqrt;
Console.WriteLine(i); 
...