为什么浮点数在计算相同值后大于双倍?为什么float不能隐式转换为Decimal

Ima*_*mad 0 c# math floating-point

关于SO的这么多算术问题,特别是浮点因此我将我的两个问题合并在一起.

  1. 为什么浮动0.3333333>双0.333333333333333

这是证明它的程序.

        static void Main(string[] args)
        {
            int a = 1;
            int b = 3;
            float f = Convert.ToSingle(a) / Convert.ToSingle(b);
            double db = Convert.ToDouble(a) / Convert.ToDouble(b);
            Console.WriteLine(f > db);
            Console.Read();
        }
Run Code Online (Sandbox Code Playgroud)
  1. 为什么float不能隐式转换decimal ,但int可以?

例如

decimal d1 = 0.1f; //error
decimal d2 = 1; //no error
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 5

对于您的第一个问题,当您在它们上使用运算符时,floats实际上会转换为doubles >.如果你打印(double)f,你会看到它的价值:

0.333333343267441
Run Code Online (Sandbox Code Playgroud)

虽然db是:

0.333333333333333
Run Code Online (Sandbox Code Playgroud)

对于第二个问题,虽然没有从隐式转换floatdecimal,有一个明确的一个,所以你可以使用强制转换:

float a = 0.1f; 
decimal d = (decimal)a;
Run Code Online (Sandbox Code Playgroud)

我在语言规范中找不到为什么会这样,但我推测这种转换不是你应该做的,所以你需要明确它.你为什么不这样做?因为decimal应该代表离散金额,如货币,float而且double应该代表连续金额.它们代表两种截然不同的东西.