Mod返回奇怪的值

时间:2011-01-14 07:53:39

标签: c#

我是编程的新手,我正在尝试编写一个可以计算百分比的程序,然后根据结果显示格式化的答案。

if(percent % 1 == 0.0)
{
    sw.Write(" {0}%", (int)percent);
}
else
{
sw.Write((" {0:f1}%", percent);

在这种情况下,百分比值分别为11,14,12,6和4.除了14之外,它显示为整数,但是14显示为14.0。如果我观察百分比数字将会出现11.0 12.0等,但是14则为14.000000000000004,因此显示不正确。这是一些怪癖还是我只是没有正确编程?关心巴里

2 个答案:

答案 0 :(得分:1)

您不应使用operator ==比较浮动值。

我发布了一些代码here,说明了应该如何完成。

修改

一个完整的例子:

class Program
{
    static double epsilon = 0.000001;

    static bool DoubleEquals(double value1, double value2)
    {
        return Math.Abs(value1 - value2) < epsilon;
    }

    static void Print(double percent, TextWriter sw)
    {
        if (DoubleEquals(percent % 1, .0))
        {
            sw.Write(" {0}%", (int)percent);
        }
        else
        {
            sw.Write(" {0:f1}%", percent);
        }
    }

    public static void Main(string[] args)
    {
        Print(11.0, Console.Out);
        Print(14.000000000000004, Console.Out);
        Print(12.0, Console.Out);
        Print(6.0, Console.Out);
        Print(4.0, Console.Out);

        Console.Write("Press any key to continue . . . ");
        Console.ReadKey(true);
    }

当然,您必须将epsilon调整为足够小的值。

答案 1 :(得分:0)

如果您在固定小数位后,请尝试以下方法:

sw.Write(string.Format("{0:0.00}", percent)); 

http://www.csharp-examples.net/string-format-double/