Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在计算相同的值后float大于double?为什么浮点不能隐式转换为十进制_C#_Math_Floating Point - Fatal编程技术网

C# 为什么在计算相同的值后float大于double?为什么浮点不能隐式转换为十进制

C# 为什么在计算相同的值后float大于double?为什么浮点不能隐式转换为十进制,c#,math,floating-point,C#,Math,Floating Point,这么多的算术题,特别是浮点数,所以我把我的两个问题合并在一起 为什么浮动0.3333>双0.333? 这是证明这一点的程序 static void Main(string[] args) { int a = 1; int b = 3; float f = Convert.ToSingle(a) / Convert.ToSingle(b); double db = Con

这么多的算术题,特别是浮点数,所以我把我的两个问题合并在一起

为什么浮动0.3333>双0.333? 这是证明这一点的程序

        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();
        }
为什么float不能隐式转换为decimal,而int可以? e、 g

对于第一个问题,当对浮点数使用>运算符时,浮点数实际上会转换为双精度浮点数。如果打印doublef,您将看到其值:

0.333333343267441
而db是:

对于第二个问题,虽然没有从float到decimal的隐式转换,但有一个显式转换,因此可以使用强制转换:

float a = 0.1f; 
decimal d = (decimal)a;
我在语言规范中找不到任何东西来解释为什么会这样,但我推测这种转换不是你应该做的事情,所以你需要明确说明。你为什么不这样做?因为十进制应该表示离散的金额,比如货币,而浮动和双精度应该表示连续的金额。它们代表两种截然不同的东西

当源文本中的数字(如.3333333)转换为浮点时,它们将四舍五入到最接近的可表示值。恰好最接近.3333333的浮点值略大于.3333333;为0.333333313465118408203125,最接近0.333333的双精度值略小于该值;它是0.333332981762708868700428865849971771240234375。由于0.333333313465118408203125大于0.333333333332981762708868700428865849971771240234375,因此f>db的计算结果为true

我不熟悉C的规则及其十进制类型。然而,我怀疑十进制d1=0.1f的原因;当小数点d2=1时不允许使用;允许的情况是,并非所有浮点值都可以无错误地转换为十进制,而所有int值都可以无错误地转换为十进制,十进制使用96位有效位,这足以精确表示任何整数。但是,它的范围比float小,其最大有限值为296−1,约7.9228•1028。最大的有限浮点数是2128−2104,约3.4028•1038


+1为了回答问题1,我必须在第二个问题上提问,即使int和decimal的用法也应该不同,但int和decimal仍然可以隐式转换。@Imad int表示离散的数量,就像苹果的数量一样。十进制也代表一个离散的数量,就像苹果的价格一样。它们都是离散的。十进制、浮点和双精度都是具有离散点集的浮点pont格式。它们都不是连续的;它们中的每一个都是量子化的。唯一的区别在于它们使用的基数。十进制似乎更适合人类的唯一原因是它使用人类用于许多事情的相同基数。对于不关心数字系统的自然世界来说,不同半径的格式基本上没有区别。但十进制具有更高的精度,因此在guess@Imad:可能每个int都可以无误地转换为十进制,但并不是每个浮点都可以无错误地转换为整数,所以即使这个特殊情况不会有任何错误,也不允许进行默认转换。这就是我没有得到的。即使在十进制有了更大的门蒂萨和精度之后,为什么会有错误的机会?@lmad:十进制格式是一个符号和一个96位整数除以十的幂,幂的范围是0到28。这意味着它所能代表的最大数字是2^96−1.但是最大的有限浮点是2^128−2^104. 所以十进制不能代表大的浮点。另外,在十进制中考虑1/2、1/4、1/8、…,这些是:5、25、125。两个^−n、 最后5位落在小数点后n位。但是最小的正浮动是2^−149小数点从45位开始,一直到149位。所以,它需要105位数字才能准确表示,但十进制数字最多只有29位。
0.333333333333333
float a = 0.1f; 
decimal d = (decimal)a;