A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李永涛 中级黑马   /  2012-11-23 20:44  /  1245 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在运算过程中,要求参与运算的两个操作数的类型必须相同,并且经过运算后的结果也与操作数的类型相同。
而在我们写程序的时候常会遇见这样的情况:
举个例子:如在我们计算一个圆的面积时。代码如下
  1. static void Main(string[] args)   
  2.      {         
  3.        //计算一个半径为5的圆的面积     
  4.        double pi = 3.14;   //定义常量PI   
  5.        int r = 5;    //定义半径      
  6.        double s = r * r * pi;  //计算圆的面积      
  7.        Console.WriteLine("圆的面积为:{0}",s);     
  8.        Console.ReadKey();     
  9.    }
复制代码

在这里是可以进行计算的,计算结果为:78.5

而在之前我们知道参与运算的两个操作数的类型必须相同,并且经过运算后的结果也与操作数的类型相同。而在这里double s = r * r * pi;这里为什么整型的半径r可以和double类型的pi进行计算呢?而计算结果为什么又是double类型呢?那不是矛盾了吗?其实有这样一个情况,当参与运算的操作数和计算结果类型不一致时,满足下列条件时,系统自动完成类型转换。
1、参与运算的两种类型兼容
a) 例如:int和double兼容,因为它们都为数字类型,而string与int或double则不兼容
2、目标类型大于源类型
a) 例如:double>int,一边的数据类型表示范围大,一边表示范围小,并且把范围小的转向范围大的不丢失精度。
这样就可以解释double s = r * r * pi为什么可以计算了,因为r=5,为int类型,r*r之后仍为int类型,而int类型和double类型是不可以进行运算的,所以在编译时编译器就会判断该表达式是否满足以上自动转换的条件,而r为int类型,pi为double类型,它们数据类型兼容并且int<double,在将r转换为double类型后不会丢失精度。所以编译器就会将r*r转换为double类型在进行运算。
而有时我们知道decimal d=3.14 这样一个赋值运算是不可以的,因为我们知道3.14是double类型,而double类型表示的范围要远远大于decimal,一旦转换将会丢失精度。而decimal d=3.14m;double db=d;这样也是不可以的,虽然decimal表示的范围不如double大,但是decimal的有效位数要大于double,转换之后也将会丢失精度。
对于一个表达式,如果一个操作数为double类型,则整个表达式可提升为double类型。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览
本帖最后由 许庭洲 于 2012-11-23 22:00 编辑

谢谢分享,值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马