保证程序运行整型数据有效
博客专区 > tcxu 的博客 > 博客详情
保证程序运行整型数据有效
tcxu 发表于6个月前
保证程序运行整型数据有效
  • 发表于 6个月前
  • 阅读 11
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: 写代码首先要为变量正确选取类型,以保证程序在整个运行的过程中,变量值在有效的取值范围内变更, 即保证数据在操作过程中的有效性。这也是最终获得正确结果的先决条件。 Java有四种基本整型数据类型:byte, short, int, 和 long. 不同类型的变量,其取值范围各不相同。在Java程序运行的过程中,若遇到 “所要储存的数值,在取值范围之外”的情况,那接下来就只有一条难以察觉的死路。因为,此刻既不会有异常抛出,也不会终止运行, 而接下来的运行, 将会产生更多的“垃圾”。 本文以计算阶乘为例,演示运行 有效/无效 数据的场景。

Java 四种基本整型数据类型变量的操作限制 

编译运行以下程序,可以得到Java四种基本整型数据类型:byte, short, int, 和 long 的取值范围。

public class Limits{
	public static void main(String args[]){
/* 打印六种数字基本类型变量的最大值和最小值 */   
System.out.println("长型最大值 LONG_Max: " + Long.MAX_VALUE);
System.out.println("长型最小值 LONG_Min: " + Long.MIN_VALUE);
System.out.println("整型最大值 Int_Max: " + Integer.MAX_VALUE);
System.out.println("整型最小值 Int_Min: " + Integer.MIN_VALUE);
System.out.println("短型最大值 SHORT_Max: " + Short.MAX_VALUE);
System.out.println("短型最小值 SHORT_Min: " + Short.MIN_VALUE);
System.out.println("字节型最大值 BYTE_Max: " + Byte.MAX_VALUE);
System.out.println("字节型最小值 BYTE_Min: " + Byte.MIN_VALUE);
	}
}

输出:

长型最大值 LONG_Max: 9223372036854775807

长型最小值 LONG_Min: -9223372036854775808

整型最大值 Int_Max: 2147483647

整型最小值 Int_Min: -2147483648

短型最大值 SHORT_Max: 32767

短型最小值 SHORT_Min: -32768

字节型最大值 BYTE_Max: 127

字节型最小值 BYTE_Min: -128

知识要点:

  • Java四种基本整型数据类型变量 (长型 long、整型 int、短型 short、和字节型 byte),  需要不同的存储空间(分别为 8、4、2、1 字节),表示不同的数据取值范围。
  • Java 字节型 (byte)变量,需1 个字节的存储空间,所能表示的最大正整数为:2^7 - 1 = 127,最小负整数:-128。
  • Java 整型 (int)变量,需4 个字节的存储空间,所能表示的最大正整数为:2^31 - 1 = 2147483647,最小负整数:-2147483648。
  • Java 为每个基本数据类型(primitive data type)设计了一个对应的类, 来处理有关事宜。四个基本整型数据类型都对应有各自的包装类(或称外覆类或数据类型类, Wrapper Class)。
  • 这四种基本整型数据类型的包装类分别是:Long、Integer、Short、和 Byte。 它们都用静态字段:MAX_VALUE 和MIN_VALUE 分别表明所能存储的最大正整数和最小负整数。

 

有效数据 Valid Data

N的阶乘是指 从1乘以2乘以3乘以4 一直乘到所要求的数 n!=1×2×3×……×n  或 n!=n×(n-1)!

程序分别通过 byte, short, int, long 类型变量计算阶乘,并使用 BigDecimal 和 BigInteger 进行对比计算,结果展示如图:

分析:

  • 与其余较可靠渠道的计算结果相比, byte, short, int, long变量,先后分别第一次出现了6、8、13、21阶乘的“垃圾”数据。这四个单元格背景均标为红色。
  • 在 字节型、短型、整形、和 长型 这四列里,每列 红单元格以下的单元格数据,都是“垃圾”。
  • 选择 byte 为变量类型,只能正确计算最高 5 的阶乘; 选择 short, 最高7的阶乘;选择 int, 最高 12 的阶乘; 选择long, 最高20的阶乘。
    选择的变量类型 最高能计算的阶乘 n!
    byte 5
    short 7
    int 12
    long 20
  • 通过 BigDecimal 和/或 BigInteger,才能得到更高(n>20)阶乘的数据。

供上述比较分析用的java程序代码,如下:

import java.math.BigDecimal;
import java.math.BigInteger;
import java.awt.Graphics;
import java.awt.Component;
import java.awt.Color;
import java.lang.*; 
import javax.swing.*;
import javax.swing.table.TableColumn;
import javax.swing.table.DefaultTableCellRenderer;

public class Factorial_0 extends JFrame {

  byte byteFac=1;//用字节型存储阶乘的变量,0阶乘为1
  short shortFac=1;//用短型存储阶乘的变量,0阶乘为1
  int iFactoria1=1;//用整型存储阶乘的变量,0阶乘为1
  long lFactoria1=1;//用长型存储阶乘的变量,0阶乘为1
  /*创建代表整数1的BigDecimal对象*/
  BigDecimal bFactorial = new BigDecimal("1");
  /*创建代表整数1的BigInteger对象*/
  BigInteger big= new BigInteger("1");
  /*创建储存数据的二维字符串类型的数组 data*/
  String data[][]=new String[27][7]; 
  /*创建表的列(字段)名称*/
  String fields[] = {"阶乘", "用字节型", "用短型short", "用整型 int ", 
  "通过长型 long 计算", "使用 BigDecimal 计算","使用 BigInteger 计算"};
	
	
public static void main(String args[]) { //主方法代码块开始
		new Factorial_0();
	}//主方法代码块结束

public void makeFace(JTable table) {  // 渲染单元格背景色 方法 makeFace 开始
        try {  
            DefaultTableCellRenderer tcr = new DefaultTableCellRenderer() {  
  
                public Component getTableCellRendererComponent(JTable table,  
                        Object value, boolean isSelected, boolean hasFocus,  
                        int row, int column) {  
                    if (row % 2 == 0) {  
                        setBackground(Color.white);//设置奇数行底色  
                    } else if (row % 2 == 1) {  
                        setBackground(new Color(255, 204, 255));//设置偶数行底色  
                    }
                    if ((row == 5 && column == 1) || (row == 7 && column == 2)
                     || (row == 12 && column == 3) || (row == 20 && column == 4)) 
                    setBackground(Color.red); 
          
                    return super.getTableCellRendererComponent(table, value,  
                            isSelected, hasFocus, row, column);  
                }  
            };  
            for (int i = 0; i < table.getColumnCount(); i++) {  
                table.getColumn(table.getColumnName(i)).setCellRenderer(tcr);  
            }  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        }  
    } // 方法 makeFace 结束
    

public Factorial_0(){ //类 Factorial 的构造方法代码块 开始
	super("查看用各种方法储存正整数的能力 :计算阶乘");
	factorial();
	JTable table = new JTable(data,fields);
	table.getColumnModel().getColumn(0).setMaxWidth(70);
	table.getColumnModel().getColumn(1).setMaxWidth(70);
	table.getColumnModel().getColumn(2).setMaxWidth(70);
	table.getColumnModel().getColumn(3).setMaxWidth(80);
	table.getColumnModel().getColumn(4).setMaxWidth(200);
	table.getColumnModel().getColumn(5).setMaxWidth(300);
	table.getColumnModel().getColumn(6).setMaxWidth(300);
	makeFace(table); // 调用 makeFace 方法,渲染单元格背景色
	JScrollPane pane = new JScrollPane( table );//将table放入一个有滚动条的视口
    getContentPane().add(pane);//将视口放置于带有标题和边框的顶层窗口JFrame
	setVisible(true);
	setSize(850,500);
	} // 构造方法代码块 结束

public void factorial(){ // 方法 factorial() 计算阶乘开始
for (int i=1; i<27;i++){ //用for循环语句输出1到16的阶乘
    byteFac 	*=i;
    shortFac 	*=i;
    iFactoria1 	*=i;  //将i的阶乘存入整型变量
    lFactoria1 	*=i;  //将i的阶乘存入长型变量
    bFactorial = bFactorial.multiply(new BigDecimal(Integer.toString(i)));
    big = big.multiply(new BigInteger(Integer.toString(i)));
	/*将数据以字符串形式存入二维数组data*/
	data[i-1][0] = i + "的阶乘:";
	data[i-1][1] = Byte.toString(byteFac); //将byte型数据转换成字符串型,存入data数组
	data[i-1][2] = Short.toString(shortFac);//将short型数据转换成字符串型,存入data数组
	data[i-1][3] = Integer.toString(iFactoria1);//将int型数据转换成字符串型,存入data数组
	data[i-1][4] = Long.toString(lFactoria1);//将long型数据转换成字符串型,存入data数组
	data[i-1][5] = bFactorial.toString();//将BigDecimal数据对象转换成字符串型,存入data数组
	data[i-1][6] = big.toString();//将BigInteger数据实体转换成字符串型,存入data数组
	}
	/*将各种类型能表示的最大正整数值,以字符串形式存入二维数组 data 的最后一行 */
	data[26][0]="MAX_VALUE";
	data[26][1]= Byte.toString(Byte.MAX_VALUE);
	data[26][2]= Short.toString(Short.MAX_VALUE);
	data[26][3]= Integer.toString(Integer.MAX_VALUE);
	data[26][4]= Long.toString(Long.MAX_VALUE);
	data[26][5]="无 MAX_VALUE 字段";
	data[26][6]="无 MAX_VALUE 字段";	
  }  // 方法 factorial() 代码块结束
}  // 类 Factorial_0 定义结束

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 15
博文 4
码字总数 4229
×
tcxu
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: