当算术运算或类型转换等计算产生的结果值超出接收类型的容量时,就会发生算术溢出。
类型为int和long的表达式及其无符号对应类型,在这种情况下会静默地回绕。
整数运算的行为可以通过使用checked关键字来修改。当checked块内发生溢出时,会抛出OverflowException的实例。
int one = 1;
checked
{
int expr = int.MaxValue + one; // OverflowException is thrown
}
// or
int expr2 = checked(int.MaxValue + one); // OverflowException is thrown
类型为float和double的表达式会取特殊值无穷大。
类型为decimal的表达式会抛出OverflowException的实例。
Hyperia 这个国家问题不少。尤其是通货膨胀已经失控。你被专程请来,与中央银行签下了一份合同。
为了简化内部的行政管理,中央银行把每个面额都拆成了两部分:一部分是相对不变的_基准值_,另一部分是_乘数_(所有面额共用同一个),可以按年、按周甚至按天调整。
印在纸币上的面额,就是_基准值_与_乘数_的乘积。
这套系统刚启用时,最小面额的纸币已经是 10,000,000 了。下表列出了系统刚启用时的情况(前 3 个面额)。此后情况恶化了很多,不光乘数在变,基准值也在变。
| 基准值 | 乘数 | 面额 |
|---|---|---|
| 10,000 | 1,000 | 10,000,000 |
| 50,000 | 1,000 | 50,000,000 |
| 100,000 | 1,000 | 100,000,000 |
| ... | 1,000 | ... |
总而言之,也就是说_面额_ = 基准值 * 乘数。
请实现CentralBank.DisplayDenomination()方法,它接收基准值和乘数,返回二者乘积的字符串(基准值 * 乘数)。返回的数字字符串不要做格式化。
如果乘法运算发生溢出,则应返回字符串"*** Too Big ***"。
CentralBank.DisplayDenomination(10000L, 1000L);
// => "10000000"
CentralBank.DisplayDenomination(long.MaxValue / 2, 10000L);
// => "*** Too Big ***"
中央银行内部记录国内生产总值时,用的也是同样的乘数思路。统计数据先以基准面额记录,再用乘数放大。
请实现CentralBank.DisplayGDP()方法,它接收基准国内生产总值和当前乘数,返回国内生产总值的字符串。
如果无法计算国内生产总值,则返回"*** Too Big ***"。
CentralBank.DisplayGDP(555f, 10000f);
// => "5550000"
CentralBank.DisplayGDP(float.MaxValue / 2, 10000f);
// => "*** Too Big ***"
你在银行的老板希望确保发薪时不会出问题。
请实现CentralBank.DisplayChiefEconomistSalary()方法,它接收一个以基准单位表示的薪水(同上)和一个乘数,返回二者乘积的字符串。
如果无法计算薪水,则返回"*** Much Too Big ***"。
CentralBank.DisplayChiefEconomistSalary(555000m, 10000m);
// => "5550000000"
CentralBank.DisplayChiefEconomistSalary(555000m, decimal.MaxValue / 2L);
// => "*** Much Too Big ***"