账户初次存入2000元,账户的年利率为0.025,月利率是年利率除以12,以后每月还向账户额外存入100元,求6个月后的账户余额,标准答案是2528.26,我为什么不对捏?
Console.WriteLine("请输入出此存款金额:");
            int de = int.Parse(Console.ReadLine());
            Console.Write("请输入存款年利率:");
            double rate = double.Parse(Console.ReadLine());
            double rate_m = rate / 12;
            double sum = de;
            int i = 1;
            Console.WriteLine("请输入几个月后取出:");
            int n = int.Parse(Console.ReadLine());
            while (i <= n)
            {
                
                sum = sum + sum * rate_m+100;
                i++;
            }            Console.WriteLine("{0}个月后的帐户余额" + sum.ToString("F2"), n);

解决方案 »

  1.   

    这不是简单的数学问题...浮点数有固有误差,这是计算机原理基础问题...改用decimal类型,这是用于财务这类要求较高精度计算的高精度类型...
      

  2.   

    恩,我看你的程序也没什么问题,拷贝你的代码测试了一下,应该就是精度不够四舍五入造成的。你应该使用decimal类型,这是专门供财务、货币使用的高精度数据类型
    DecimalDecimal 值类型表示从正 79,228,162,514,264,337,593,543,950,335 到负 79,228,162,514,264,337,593,543,950,335 之间的十进制数。Decimal 值类型适用于要求使用大量有效的整数及小数位数并且没有舍入错误的财务计算。十进制数是由符号、数值和比例因子组成的浮点值,数值的每一位的范围都是 0 到 9,比例因子指示分隔数值的整数和小数部分的浮点小数点的位置。Decimal 值的二进制表示形式由 1 位符号、96 位整数以及比例因子组成,比例因子用作 96 位整数的除数并指定整数的哪一部分为小数。比例因子隐式地定为数字 10 的幂,指数范围从 0 到 28。因此,Decimal 值的二进制表示形式为:((-296 到 296) / 10(0 到 28)),其中 -296-1 等于 MinValue,而 296-1 等于 MaxValue。比例因子还保留 Decimal 数字中的所有尾随零。在算术或比较运算中,尾随零并不影响 Decimal 数字的值。但是,如果应用了正确的格式字符串,则可由 ToString 方法显示尾随零。有关转换的注意事项
    此类型提供将 Decimal 值转换为 Char、SByte、Int16、Int32、Int64、Byte、UInt16、UInt32 和 UInt64 类型及其反向转换的方法。从其他类型到 Decimal 的转换属于扩大转换,不会丢失信息或引发异常。从 Decimal 到其他类型的转换属于收缩转换,会将 Decimal 值向零舍入为最接近的整数值。如果转换结果无法以目标类型表示,则引发 OverflowException。此类型提供将 Decimal 值转换为 Single 和 Double 的方法及其反向转换的方法。从 Decimal 到 Single 或 Double 的转换属于收缩转换,可能会丢失精度,但不会丢失所转换值的数量大小信息。此类转换不会引发异常。如果从 Single 或 Double 到 Decimal 的转换的结果无法表示为 Decimal,则将引发 OverflowException。 
    DoubleDouble 值类型表示一个值介于 -1.79769313486232e308 和 +1.79769313486232e308 之间的双精度 64 位数字,以及 +0 或-0、PositiveInfinity、NegativeInfinity 和非数字 (NaN)。Double 符合二进制浮点算法的 IEC 60559:1989 (IEEE 754) 标准。Double 为比较此类型的实例,将实例的值转换为它的字符串表示形式以及将数字的字符串表示形式转换为此类型的实例提供了相应的方法。有关格式规范代码如何控制值类型的字符串表示形式的信息,请参见格式化概述、标准数字格式字符串 和 自定义数字格式字符串。使用浮点数
    在执行二进制运算时,如果其中一个操作数为 Double,那么另一个操作数必须是整数类型或浮点类型(Double 或 Single)。在执行运算之前,如果另一个操作数不是 Double,应将其转换为 Double,并且至少要使用 Double 的范围和精度来执行运算。如果此运算得到一个数字结果,则结果的类型为 Double。浮点运算符(包括赋值运算符)不会引发异常。在异常情况下,浮点运算的结果为零、无穷或 NaN,如下所述:如果浮点运算的结果对于目标格式来说太小,则运算的结果为零。如果浮点运算结果的数值对于目标格式来说太大,则运算的结果为 PositiveInfinity 或 NegativeInfinity(具体取决于结果的符号)。如果浮点运算无效,则运算的结果为 NaN。如果浮点运算的一个或两个操作数为 NaN,则运算的结果为 NaN。请记住,浮点数只能近似于十进制数字,浮点数的精度决定了浮点数近似于十进制数字的精确程度。默认情况下,Double 值的精度是 15 个十进制位,但内部维护的最大精度是 17 位。浮点数的精度有几种结果:特定精度下看似相等的两个浮点数可能并不相等,因为它们的最小有效位数不同。由于浮点数可能无法精确近似于十进制数,如果使用十进制数,则使用浮点数的数学或比较运算可能不会产生相同的结果。如果涉及浮点数,值可能不往返。值的往返是指,某个运算将原始浮点数转换为另一种格式,而反向运算又将转换后的格式转换回浮点数,且最终浮点数与原始浮点数相等。由于一个或多个最低有效位可能在转换中丢失或更改,往返可能会失败。 
    SingleSingle 值类型表示一个值介于 -3.402823e38 和 +3.402823e38 之间的单精度 32 位数字,以及正零或负零、PositiveInfinity、NegativeInfinity 和非数字 (NaN)。Single 符合二进制浮点算法的 IEC 60559:1989 (IEEE 754) 标准。Single 为比较此类型的实例,将实例的值转换为它的字符串表示形式以及将数字的字符串表示形式转换为此类型的实例提供了相应的方法。有关格式规范代码如何控制值类型的字符串表示形式的信息,请参见格式化概述、标准数字格式字符串 和 自定义数字格式字符串。使用浮点数
    在执行二进制运算时,如果一个操作数为浮点类型(Single 或 Double),那么另一个操作数应当为整数类型或浮点类型。此运算计算如下:如果其中一个操作数为整数类型,那么该操作数将被转换为另一个操作数所属的浮点类型。然后,如果任意一个操作数为 Double,则另一个操作数将被转换为 Double,并且至少使用 Double 的范围和精度执行运算。对于数值运算,结果的类型为 Double。否则,将至少使用 Single 类型的范围和精度执行运算,而且对于数值运算,结果的类型为 Single。浮点运算符(包括赋值运算符)不会引发异常。在异常情况下,浮点运算的结果为零、无穷或 NaN,如下所述:如果浮点运算的结果对于目标格式来说太小,则运算的结果为零。如果浮点运算结果的数值对于目标格式来说太大,则运算的结果为 PositiveInfinity 或 NegativeInfinity(具体取决于结果的符号)。如果浮点运算无效,则运算的结果为 NaN。如果浮点运算的一个或两个操作数为 NaN,则运算的结果为 NaN。请记住,浮点数只能近似于十进制数字,浮点数的精度决定了浮点数近似于十进制数字的精确程度。默认情况下,Single 值只包含 7 位精度,但内部维护的最大精度是 9 位。浮点数的精度有几个结果:某个特定精度似乎相等的两个浮点数可能会因为其最低有效位不同而不相等。由于浮点数可能无法精确近似于十进制数,如果使用十进制数,则使用浮点数的数学或比较运算可能不会产生相同的结果。如果涉及浮点数,值可能不往返。值的往返是指,某个运算将原始浮点数转换为另一种格式,而反向运算又将转换后的格式转换回浮点数,且最终浮点数与原始浮点数相等。由于一个或多个最低有效位在转换中丢失或更改,往返可能失败。
      

  3.   

    用了Decimal了,,还是一样呀????
      

  4.   


            static void Main(string[] args)
            {
                double d = 0.025;
                double md = d / 12;
                double money = 2000;
                for (int i = 0; i < 6; i++)
                {
                    money += money * md;
                    if (i < 5)
                        money += 100;
                }
                Console.WriteLine(money);
                Console.ReadLine();
            }
      

  5.   

    以后每月还向账户额外存入100元,这一百应该算进去吧 
    sum = sum + sum * rate_m+100;这个表达式是不是改成更合理些
     sum  += (sum +100) * rate_m;
                      decimal rate_m =(decimal)0.025;
                        decimal sum = 2000;
                        int i = 0;
                        while (i < 6)
                        {                        sum  += (sum +100) * rate_m;
                            i++;
                        }                    Console.WriteLine("{0}个月后的帐户余额" + sum.ToString("C"), 6);
                        Console.ReadKey();我计算得:2335.36
      

  6.   

    1,改decimal类型
    2,你和标准答案差100,是一个月存入的钱数,肯定是你理解题意有偏差,到底存几个月的钱,搞清楚