int a=13/2引起的思索

衣明志 发表于 , 阅读 (15242)

最近给一些技术公司进行asp.net开发方向的培训,培训过程中曾发现一些简单的问题却几乎全军覆没的答错,而其中不乏一些曾在多年使用C#进行过项目开发的技术人员。比如说,我曾经出过一个题让参加培训的人员回答:int a=13/2的结果。技术人员的答案有以下几种情况:

  • 代码错误,因为13/2的值不是整形
  • 7
  • 6
  • 1

那么我们知道,VS2008中写成 “var a=13/2” 的形式,如果我们将题目写成如此。那么大概更多的人会写成是答案为6.5了。原因是什么呢?原因是很多C#程序员对基本语法并不完全熟悉,想当然的认为一些运算的规则是如何如何。作为程序员,我想我们应该对自己严格要求才好,不然如果上面的运算是一笔资金,那么0.5的误差后面单位可能是百万或者亿,损失可就大了。

那么,我们来看看msdn中如何描述“/”运算符的:

两个整数相除的结果始终为一个整数。例如,5 除以 2 的结果为 2。若要确定 5 除以 2 的余数,请使用 modulo 运算符 (%)。若要获取作为有理数或分数的商,应将被除数或除数设置为 float 类型或 double 类型。可以通过在数字后添加一个小数点来隐式执行此操作

由上面这段msdn对除法运算符的描述,我们知道题目的答案应该是6。那么我们如何才能得到6.5的值呢,方法大概如下

var a=13/2.0
var a=13.0/2
var a=13f/2
var a=13d/2
var a=13/2f
var a=13/2d
……

上面几种方式,思路一致,就是让运算式中一个值为有理数类型,f和d都是字面值表示前面的数字为float类型和double类型的。当然了用m也可以啦,因为m表示decimal类型。