Как переписать формулу на C#?
У меня есть формула из эксель. Как её записать на C#?
=Span*(1+(8*nomSAG^2)/(3*Span^2))/(1+(CableWT*Span^2)/(8*CableEA*nomSAG))*(1+'Cable Data'!$H$18/1000000*(ЕСЛИ(METk=0,73;-1;ЕСЛИ(METk=2,92;-10;ЕСЛИ(METk=4,38;-20;15)))-$O$12))
Написал следующий метод:
public double GetLength(double span, double nomSAG, double cableEA, double thermalExpansion, double kFactor, double instTemp)
{
if (kFactor == 0.73)
{
kFactor = -1;
}
if (kFactor == 2.92)
{
kFactor = -10;
}
if (kFactor == 4.38)
{
kFactor = -20;
}
else
{
kFactor = 15;
}
return span * ( 1 + (8 * Math.Pow(nomSAG, 2)) / (3 * Math.Pow(span,2))) / (1 + (CableWT * Math.Pow(span,2)) / (8 * cableEA * nomSAG)) * (1 + thermalExpansion / 1000000 * kFactor - instTemp);
}
Происходит ошибка при расчётах не могу понять почему
Span = 150
CableWT = 0.089 - константа
nomSag = 2.3
cableEa = 109374
thermalExpansion = 16.86
kFactor = 0.2
instTemp = 20
Ожидаемый результат 149.86
GetLength(150, 2.3,109374,16.86, 0.2, 20)
Ответы (2 шт):
Никак не получается 149.86, быть может неточно указаны входные данные. Нашел только где вы потеряли скобочки:
(kFactor - instTemp)
Но чтобы разобраться, пришлось переписать вашу формулу в сторону упрощения
const double CableWT = 0.089;
static double GetLength(double span, double nomSAG, double cableEA, double thermalExpansion, double kFactor, double instTemp)
{
kFactor = Math.Round(kFactor, 2, MidpointRounding.AwayFromZero) switch
{
0.73 => -1,
2.92 => -10,
4.38 => -20,
_ => 15
};
return span *
(1 + 8 * nomSAG * nomSAG / (3 * span * span)) /
(1 + CableWT * span * span / (8 * cableEA * nomSAG)) *
(1 + thermalExpansion / 1000000 * (kFactor - instTemp));
}
Когда сравниваете double, не забывайте округлять, а лучше вообще не сравнивайте double на равенство, никогда. :)
Проверяем
double result = GetLength(150, 2.3, 109374, 16.86, 0.2, 20);
Console.WriteLine(result.ToString("F2"));
И ваш и мой вариант метода, выдают одинаковый результат
149,93
1000000 * (kFactor - instTemp) //149.932202954269
Вы скобки пропустили =)
Всё остальное в рамках погрешности double, Excel может использует float или decimal, может ещё где-то double округлять... НО скорее всего float, что там под капотом у Excel знают только те, кто скрипты к нему пишут.
Если хотите точности - используйте decimal на всех этапах, но учтите что он медленнее.