การขาดตัวดำเนินการเลขชี้กำลังสำหรับ C # นั้นเป็นเรื่องที่น่ารำคาญอย่างมากสำหรับเราเมื่อต้องการภาษาใหม่เพื่อแปลงซอฟต์แวร์การคำนวณของเราเป็นจาก ol 6 v6 ที่ดี
ฉันดีใจที่เราไปกับ C # แต่ก็ยังทำให้ฉันรำคาญเมื่อใดก็ตามที่ฉันเขียนสมการที่ซับซ้อนรวมถึงเลขชี้กำลัง วิธีการ Math.Pow () ทำให้สมการค่อนข้างยากที่จะอ่าน IMO
วิธีการแก้ปัญหาของเราคือการสร้างคลาส DoubleX พิเศษที่เราแทนที่ ^ -operator
วิธีนี้ใช้งานได้ดีตราบใดที่คุณประกาศตัวแปรอย่างน้อยหนึ่งตัวเป็น DoubleX:
DoubleX a = 2;
DoubleX b = 3;
Console.WriteLine($"a = {a}, b = {b}, a^b = {a ^ b}");
หรือใช้ตัวแปลงที่ชัดเจนกับคู่มาตรฐาน:
double c = 2;
double d = 3;
Console.WriteLine($"c = {c}, d = {d}, c^d = {c ^ (DoubleX)d}"); // Need explicit converter
ปัญหาอย่างหนึ่งของวิธีนี้แม้ว่าจะมีการคำนวณเลขชี้กำลังในลำดับที่ไม่ถูกต้องเมื่อเทียบกับตัวดำเนินการอื่น สิ่งนี้สามารถหลีกเลี่ยงได้โดยการใส่พิเศษ () รอบการดำเนินการซึ่งทำให้ยากต่อการอ่านสมการอีกครั้ง:
DoubleX a = 2;
DoubleX b = 3;
Console.WriteLine($"a = {a}, b = {b}, 3+a^b = {3 + a ^ b}"); // Wrong result
Console.WriteLine($"a = {a}, b = {b}, 3+a^b = {3 + (a ^ b)}"); // Correct result
ฉันหวังว่านี่จะช่วยคนอื่น ๆ ที่ใช้สมการที่ซับซ้อนจำนวนมากในรหัสของพวกเขาและบางทีใครบางคนอาจมีความคิดว่าจะปรับปรุงวิธีนี้ได้อย่างไร! :-)
คลาส DoubleX:
using System;
namespace ExponentialOperator
{
/// <summary>
/// Double class that uses ^ as exponential operator
/// </summary>
public class DoubleX
{
#region ---------------- Fields ----------------
private readonly double _value;
#endregion ------------- Fields ----------------
#region -------------- Properties --------------
public double Value
{
get { return _value; }
}
#endregion ----------- Properties --------------
#region ------------- Constructors -------------
public DoubleX(double value)
{
_value = value;
}
public DoubleX(int value)
{
_value = Convert.ToDouble(value);
}
#endregion ---------- Constructors -------------
#region --------------- Methods ----------------
public override string ToString()
{
return _value.ToString();
}
#endregion ------------ Methods ----------------
#region -------------- Operators ---------------
// Change the ^ operator to be used for exponents.
public static DoubleX operator ^(DoubleX value, DoubleX exponent)
{
return Math.Pow(value, exponent);
}
public static DoubleX operator ^(DoubleX value, double exponent)
{
return Math.Pow(value, exponent);
}
public static DoubleX operator ^(double value, DoubleX exponent)
{
return Math.Pow(value, exponent);
}
public static DoubleX operator ^(DoubleX value, int exponent)
{
return Math.Pow(value, exponent);
}
#endregion ----------- Operators ---------------
#region -------------- Converters --------------
// Allow implicit convertion
public static implicit operator DoubleX(double value)
{
return new DoubleX(value);
}
public static implicit operator DoubleX(int value)
{
return new DoubleX(value);
}
public static implicit operator Double(DoubleX value)
{
return value._value;
}
#endregion ----------- Converters --------------
}
}
**
เป็นตัวดำเนินการการยกกำลังแบบมัด