什么';用C#计算时,这个公式有什么错误?

什么';用C#计算时,这个公式有什么错误?,c#,math,double,equation,C#,Math,Double,Equation,我需要根据我检查过的公式计算一个值,正如我们在这个屏幕截图中看到的: 我在我的C#app中尝试了这个方程,但没有得到预期值 例如,我创建了一个基本的控制台应用程序: public static void Calculate() { var values = new double[] { 1, 0.75, 0.5, 0.25, 0}; // y = - ((4/3) * x^3) + (3 * x^2) - ((2/3) * x) foreach (var value

我需要根据我检查过的公式计算一个值,正如我们在这个屏幕截图中看到的:

我在我的C#app中尝试了这个方程,但没有得到预期值

例如,我创建了一个基本的控制台应用程序

public static void Calculate()
{
    var values = new double[] { 1, 0.75, 0.5, 0.25, 0};

    // y = - ((4/3) * x^3) + (3 * x^2) - ((2/3) * x)
    foreach (var value in values)
    {
        var calcul1 = - ((4 / 3) * Math.Pow(value, 3))
                      + (3 * Math.Pow(value, 2))
                      - ((2 / 3) * value);

        var calcul2 = ((-4 / 3) * (value * value * value))
                      + (3 * (value * value))
                      + ((-2 / 3) * value);

        Console.WriteLine($"value: {value} - calcul1: {calcul1} / calcul2: {calcul2}");
    }
}
我得到的结果与预期结果不太接近:

value: 1 - calcul1: 2 / calcul2: 2
value: 0.75 - calcul1: 1.265625 / calcul2: 1.265625
value: 0.5 - calcul1: 0.625 / calcul2: 0.625
value: 0.25 - calcul1: 0.171875 / calcul2: 0.171875
value: 0 - calcul1: 0 / calcul2: 0

怎么了?它是否与使用double有关?

为了获得正确的值,我重构了您的代码。 如果执行除法计算时没有显式转换c#隐式转换为整数,则丢弃小数部分:

public static void Calculate()
{
    var values = new double[] { 1, 0.75, 0.5, 0.25, 0};

    // y = - ((4/3) * x^3) + (3 * x^2) - ((2/3) * x)
    foreach (var value in values)
    {
        double firstFraction = (double)4/3;
        double secondFraction = (double)2/3;
        
        var calcul1 = - (firstFraction * Math.Pow(value, 3))
                      + (3 * Math.Pow(value, 2))
                      - (secondFraction * value);

        var calcul2 = ((firstFraction*-1) * (value * value * value))
                      + (3 * (value * value))
                      + ((secondFraction*-1) * value);

        Console.WriteLine($"value: {value} - calcul1: {calcul1} / calcul2: {calcul2}");
    }
}

为了获得正确的值,我重构了您的代码。 如果执行除法计算时没有显式转换c#隐式转换为整数,则丢弃小数部分:

public static void Calculate()
{
    var values = new double[] { 1, 0.75, 0.5, 0.25, 0};

    // y = - ((4/3) * x^3) + (3 * x^2) - ((2/3) * x)
    foreach (var value in values)
    {
        double firstFraction = (double)4/3;
        double secondFraction = (double)2/3;
        
        var calcul1 = - (firstFraction * Math.Pow(value, 3))
                      + (3 * Math.Pow(value, 2))
                      - (secondFraction * value);

        var calcul2 = ((firstFraction*-1) * (value * value * value))
                      + (3 * (value * value))
                      + ((secondFraction*-1) * value);

        Console.WriteLine($"value: {value} - calcul1: {calcul1} / calcul2: {calcul2}");
    }
}

您需要更加小心地处理数据类型

作为测试,请尝试显示的输出

var calc = (4 / 3) * 0.5;
Console.WriteLine(calc);  //-> shows 0.5
因为4和3是整数,这是一种没有小数点的数据类型,所以4/3=1

可以使用文字强制将4和3计算为双精度 像这样:

var calc = (4D / 3D) * 0.5;
Console.WriteLine(calc);  //-> shows 0.666666666666667

有关联机示例,请参见。您需要更加小心地使用数据类型

作为测试,请尝试显示的输出

var calc = (4 / 3) * 0.5;
Console.WriteLine(calc);  //-> shows 0.5
因为4和3是整数,这是一种没有小数点的数据类型,所以4/3=1

可以使用文字强制将4和3计算为双精度 像这样:

var calc = (4D / 3D) * 0.5;
Console.WriteLine(calc);  //-> shows 0.666666666666667

参见在线示例

整数除法:
(4/3)==1
但是:
(4d/3d)==1.333..d
谢谢@TaW,我会更新这个。整数除法:
(4/3)==1
但是:
(4d/3d)==1.333..d
谢谢@TaW,我会更新这个。