原文链接:https://blog.csdn.net/zhongkelee/article/details/52289163
基础知识
对于二进制来说,最高位代表正负号,-0表示-128,+0表示0
32位系统int型4个字节:-(2的31次方) ~ (2的31次方) 减 1
最大负数:10000000 00000000 00000000 00000000
最大正数:01111111 11111111 11111111 11111111
0: 00000000 00000000 00000000 00000000
64位系统同理,int型表示范围是:-(2的63次方) ~ (2的63次方) 减 1
大数操作
正常情况下一个整数最多只能放在long类型之中,但是如果现在有如下的一个数字:
1111111111111111111111111111111111111111111111111
根本就是无法保存的,所以为了解决这样的问题,在java中引入了两个大数的操作类:
操作整型:BigInteger
操作小数:BigDecimal
当然了,这些大数都会以字符串的形式传入。
华为机试题
现在我们来看一道华为的机试题:
写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )
package huawei.job;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
public class Main5 {
public static void main(String[] args) {
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line ;
BigInteger base = new BigInteger("16"); // 相当于2进制2^4中的底数一样,16是16进制的底数
try {
while((line = bufr.readLine()) != null){
line = line.substring(2); // 这里是因为:16进制的开头一般是0X,要去掉
BigInteger result = new BigInteger("0");
for(int i = 0; i < line.length(); i++){
char ch = line.charAt(line.length()-1-i);
if(ch >= 'A' && ch <= 'F'){
BigInteger tmp = base.pow(i).multiply(new BigInteger(Integer.toString((ch - 'A' + 10))));
result = result.add(tmp);
}else{
BigInteger tmp = base.pow(i).multiply(new BigInteger(Character.toString(ch)));
result = result.add(tmp);
}
}
System.out.println(result);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
BigDecimal也可以用于解决: 浮点数保留小数的问题
double f = 111231.5585;
BigDecimal b = new BigDecimal(f);
double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
保留两位小数
还有其他两种方法
方式二:
java.text.DecimalFormat df =new java.text.DecimalFormat("#.00");
String d = df.format(你要格式化的数字);
例:new java.text.DecimalFormat("#.00").format(3.1415926)
#.00 表示两位小数 #.0000四位小数 以此类推...
方式三:
double d = 3.1415926;
String result = String .format("%.2f");
%.2f %. 表示 小数点前任意位数 2 表示两位小数 格式后的结果为f 表示浮点型
网友评论