Java数据类型-加强理解示例:国王的麦子

在上一篇数据类型中,我们了解的数据类型的种类,这一篇文章是为了加深理解而专开的。
【目的】:认识到数据类型的重要性


你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第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吨。这大臣有点贪,不知道最后有没有被斩。


同为小白,若有缺漏及错误,敬请指出。
转载请注明出处。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汝嫣兮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值