在上一篇数据类型中,我们了解的数据类型的种类,这一篇文章是为了加深理解而专开的。
【目的】:认识到数据类型的重要性
你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第1个棋盘格放1粒麦子,在第2个棋盘格放2粒麦子,在第3个棋盘格放4粒麦子,在第4个棋盘格放8粒麦子,…后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有64格)。
国王以为他只是想要一袋麦子而已,哈哈大笑。
当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!
请你借助计算机准确地计算,到底需要多少粒麦子。
在上一篇数据类型中,我们了解的数据类型的种类,这一篇文章是便是为了加深理解而专开的。这一篇需要使用IDE,入门推荐Eclipse,你也可以自行选择其他IDE。
使用int型
具体代码:
public class _2_3_King_s_Wheat {
//国王的麦子计算
public static void main(String[] args) {
int sum = 0;//定义“和”
int count = 1;//定义棋盘里第一格的麦子数。
//使用for循环进行计算,以后介绍循环再细说
for(int i=1;i<=64;i++) {
sum = sum + count;
count = 2 * count;
}
System.out.println(sum);//输出“和”
请将代码输入或复制到IDE中运行,下同。
输出结果为:
-1
为什么呢?因为这个数它超出int类型的数值范围了。即溢出。那么整型不可以,试试长整型?删除代码,进行下一个尝试:
使用long类型
具体代码:
public class _2_3_King_s_Wheat {
//国王的麦子计算
public static void main(String[] args) {
long sum = 0;//定义“和”
long count = 1;//定义棋盘里第一格的麦子数。
//使用for循环进行计算,以后介绍循环再细说
for(int i=1;i<=64;i++) {
sum = sum + count;
count = 2 * count;
}
System.out.println(sum);//输出“和”
输出结果为:
-1
emmm…长整型还是“-1”,长整型也溢出?这咋办?记得上一篇里了解到的浮点数嘛,它的范围比长整型还要大。但是浮点数分为单精度float和双精度double两种,接下来依次进行尝试:
使用float类型
具体代码:
public class _2_3_King_s_Wheat {
//国王的麦子计算
public static void main(String[] args) {
float sum = 0;//定义“和”
float count = 1;//定义棋盘里第一格的麦子数。
//使用for循环进行计算,以后介绍循环再细说
for(int i=1;i<=64;i++) {
sum = sum + count;
count = 2 * count;
}
System.out.println(sum);//输出“和”
输出结果为:
1.8446744E19
这个值是使用科学计数法的,即1.8446744E19 = 18 446 744 000 000 000 000。终于不溢出了,那么继续尝试双精度double:
使用double类型
具体代码:
public class _2_3_King_s_Wheat {
//国王的麦子计算
public static void main(String[] args) {
double sum = 0;//定义“和”
double count = 1;//定义棋盘里第一格的麦子数。
//使用for循环进行计算,以后介绍循环再细说
for(int i=1;i<=64;i++) {
sum = sum + count;
count = 2 * count;
}
System.out.println(sum);//输出“和”
输出结果为:
1.8446744073709552E19
仍然是科学计数法,但是显然,这次的精准度更加准确。1.8446744073709552E19 = 18 446 744 073 709 552 000。即小数点的精准位数不一样。但显然仍不是准确数值。毕竟263不可能个位数为零。那怎么样才能更进一步的获取准确数值呢?
这里移入一个新的类的概念:
BIgInteger:任意大的整数,在java.math包中的BigInteger类可以处理包含任意长度数字序列的数值,BigInteger类实现了任意进度的整数运算,使用静态的valueOf()方法可以将普通的的数值转换成大数值。
精准获数:国王的麦子
public class _2_3_King_s_Wheat {
//国王的麦子计算
import java.math.BigInteger;//在类前添加该语句。引入外部类。
public static void main(String[] args) {
BigInteger sum = BigInteger.valueOf(0);
BigInteger count = BigInteger.valueOf(1);
//使用for循环进行计算,以后介绍循环再细说
for(int i=1;i<=64;i++) {
sum = sum.add(count);//不可使用加号,改用add方法。
count = BigInteger.valueOf(2) .multiply(count);//同理,在改用multiply方法后还需将“2”转换为“大数值2”.
}
System.out.println(sum.toString());//将“和”转换为字符并输出。
输出结果:
18446744073709551615
这次我们看到,输出结果终于是准确的了。
后话:
其实我还是好奇它大约有多重的。查了查百度,麦子的千粒重是30-60克。我们取中间值45。计算出来。。。约等于830,103,483,316.929822675吨。这大臣有点贪,不知道最后有没有被斩。
同为小白,若有缺漏及错误,敬请指出。
转载请注明出处。