首先看完这篇文章你可以学会,
- 在Java中如何对小数进行保留n位小数
- 四舍五入和非四舍五入
- 常见保留n位小数的方式
- 以及Java中double和float到底可以保留到小数点后几位
下面开始正文
在Java中表示小数的有double和float
分别占8个和4个字节
主要的内容都写在代码里了
import java.math.RoundingMode;
import java.text.NumberFormat;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
double d = 0.1234567890123456789;
float f = (float) 0.123456789;
float a = 2;
float b = 3;
int n = 10;
/**
* double 占8个字节 float 占4个字节
*/
System.out.println("double初始值\t" + d);
System.out.println("float初始值\t" + f);
System.out.println("float a="+a);
System.out.println("float b="+b);
System.out.println("a/b=\t"+a / b);
/**
* 如何保留n位小数 当这个n不是很大的时候,是有效(下面的方法是有效的)
* 比如一个double类型的数字,整数部分和小数部分是存在一种制约的关系的,整数部分的位数很长,小数部分的位数就会比较短
* double和float能保留小数点后多少位,也是不确定的
*
* double类型可以保存的10进制的最大的位数是从第一个非0数字开始计数,可以有17位(小数点不算位数)
* float类型可以保存的10进制的最大的位数是从第一个非0数字开始计数,可以有8位(小数点不算位数)
* 为什么结果是这样的,这就需要计算机组成原理的知识,数字在计算机中存放的当然是以二进制表示的了(只有0和1) 以double类型举例
* double是8字节,就是64位 这64位二进制,有一位表示数符(表示正负,0表示正,1表示负)
* 剩下的位数,一部分表示阶符(二进制表示,尾数乘以2的多少次方) 一部分表示尾数(二进制表示) 如果不懂可以百度一下IEE754是什么 原理都是这个原理
*/
// 四舍五入
/**
* print() format()
* 这种方式的n可以很大
*/
System.out.println("四舍五入保留n位小数");
System.out.printf("double四舍五入printf \t" + "%.5f\n", d);
System.out.printf("float四舍五入printf \t" + "%.5f\n", f);
System.out.printf("拼接n的print\t"+"%." + n + "f"+"\n", a / b);
/**
* 创建NumberFormat对象 setMaximumFractionDigits(int
* newValue);//最多保留newValue位小数,超过两位部分的自动舍去
* setMinimumFractionDigits(newValue);//至少保留newValue位小数,不足两位自动补0,
* 这种方式的n也可以很大
*/
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(10);//200都是可以的
nf.setMinimumFractionDigits(10);//200都是可以的
/**
* 设置四舍五入的模式setRoundingMode()
* 括号内的参数是类RoundingMode中的静态属性,RoundingMode类就是为了确定四舍五入的模式的
*/
nf.setRoundingMode(RoundingMode.FLOOR);// 表示不需要四舍五入,直接舍
System.out.println("double非四舍五入NumberFormat \t" + nf.format(d));
System.out.println("float非四舍五入NumberFormat \t" + nf.format(f));
System.out.println("nf.format()方式可以保留n位\t"+nf.format(a / b));
// 转换成string
String s1 = nf.format(d);
String s2 = String.valueOf(nf.format(d));
String s3 = String.format("%.2f", d);// 2表示保留2位小数
Double valueOf = Double.valueOf(String.format("%.30f", d));// 3表示保留3位小数
System.out.println("String.format()方式\t" + s3);// 四舍五入
System.out.println("double四舍五入转string类型后转double类型\t" + valueOf);
// 保留n位小数
/**
* 保留10/3结果的后20位小数 round()返回四舍五入的整数 pow(a,b)a的b次方
* 这种方法当n比较大时,结果就是错误的
*/
int a1 = 10;
System.out.println("还是不要这么写了\t"+Math.round(a / b * Math.pow(a1, n)) / Math.pow(a1, n));
}
}
运行结果截图
难道您还不点个赞
Math类中的round()方法