繁体   English   中英

为什么在计算相同的值后float大于两倍? 为什么不能将float隐式转换为Decimal

[英]Why float is bigger than double after computing same value? Why float can't be implicitly converted to Decimal

这么多关于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();
        }
  1. 为什么float不能隐式转换为decimalint可以呢?

例如

decimal d1 = 0.1f; //error
decimal d2 = 1; //no error

对于第一个问题,当在float使用>运算符时,实际上float转换为double 如果打印(double)f ,则会看到其值:

0.333333343267441

db是:

0.333333333333333

对于第二个问题,尽管没有从floatdecimal的隐式转换,但是有一个显式的转换,因此可以使用强制转换:

float a = 0.1f; 
decimal d = (decimal)a;

我在语言规范中找不到关于为什么这样做的任何内容,但我推测这种转换不是您应该执行的操作,因此需要对此进行明确说明。 你为什么不这样做呢? 因为decimal应该表示像货币一样的离散数量,而floatdouble则表示连续数量。 它们代表了两个截然不同的事物。

  1. 当源文本中的数字(例如.3333333转换为浮点时,它们将四舍五入为最接近的可表示值。 碰巧的是,最接近.3333333 float值略大于.3333333; 它是0.333333313465118408203125,而最接近0.333333333333333333的double值则稍小于该值。 它是0.333333333333332981762708868700428865849971771240234375。 因为0.333333313465118118203125大于0.333333333333332981762708868700428865849971771240234375,所以f > db计算为true。

  2. 我不熟悉C#的规则及其十进制类型。 但是,我怀疑decimal d1 = 0.1f;的原因decimal d1 = 0.1f; decimal d2 = 1;不允许decimal d2 = 1; 允许并非所有float值都可以无错误地转换为decimal ,而所有int值都可以无错误地转换为decimal 根据Microsoft的说法decimal使用96位有效数字,足以精确表示任何int 但是,它的范围比float小,其最大有限值为2 96 -1,大约7.9228•10 28 最大的有限float为2 128 -2 104 ,大约为3.4028•10 38

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM