明志唯新

int a=13/2 引起的思索

发表于

最近给一些技术公司进行 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 类型。