上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
6.1 Rational类的规格定义
有理数(rational number)是可以用分数n/d表示的数,其中n和d是整数,但d不能为零。n称作分子(numerator),而d称作分母(denominator)。典型的有理数如:1/2、2/3、112/239、2/1等。与浮点数相比,有理数的优势是小数可被精确展现,而不会被舍入或取近似值。
我们在本章要设计的类将对有理数的各项行为进行建模,包括允许有理数进行加、减、乘、除运算。要将两个有理数相加,首先要得到一个公分母,然后将分子相加。例如,要计算1/2 + 2/3,需要将左操作元的分子和分母分别乘以3,将右操作元的分子和分母分别乘以2,得到3/6 + 4/6,再将两个分子相加,得到7/6。要将两个有理数相乘,可以简单地将它们的分子和分母相乘。因此,1/2 * 2/5得到2/10,这个结果可以被更紧凑地表示为“正规化”(normalized)的1/5。有理数的除法是将右操作元的分子和分母对调,然后做乘法。例如,1/2 / 3/5等于1/2 * 5/3,即5/6。
另一个(可能比较细微的)观察是,数学中有理数没有可变的状态。我们可以将一个有理数与另一个有理数相加,但结果是一个新的有理数,原始的有理数并不会“改变”。我们在本章要设计的不可变的Rational类也满足这个属性。每一个有理数都可由一个Rational对象来表示。当你把两个Rational对象相加时,将会创建一个新的Rational对象来持有它们的和。
你会在本章看到,Scala提供给用户来编写类库的一些手段。它们就像是语言原生支持的一样。读完本章后,你将可以像下面这样使用Rational类: