Java控制小数位,获得随机数
来源:互联网 发布:mac电脑开机问号文件夹 编辑:程序博客网 时间:2024/05/01 07:18
Java控制小数位,获得随机数
怎么说呢,因为测试加速器所以创建了一个模拟的输出随机数,因为Android的随机数有两种写法,结果就跟输出随机杠上了,强迫症一犯,就干脆把各种随机数的几种写法重新总结了下,结果之后又因为Math对象的random方法跟小数位杠上了,总结了一下获得随机数的方法,和小数位的处理方法。
因为很多方法是API上面的,如果有兴趣可以自己去API查看。我这里只是稍微说一下我用的情况。
第一次写博客,没啥经验,之前因为懒,所以就没有发过。。。
- Random对象获取随机数
- Math对象获取随机数
处理小数位
- 直接格式化输出
- 类型转换(n.0格式)
- 类型转换(n.m格式)
- 数字格式化对象(NumberFormat)
- 十进制数字格式化对象(DecimalFormat)
- 16位以上数据为了保证精度(BigDecimal)
Random对象获取随机数
需要知道的是,Random对象获得的随机数都是伪随机数,是根据一个真随机数生成的。
详解:
1.next(int bits)
完全不用的一个方法,返回一个int类型的随机数。但是因为修饰类型为protected,所以使用该方法的类必须继承Random(class 类名 extends Random)
2.nextBoolean()
随机给一个true或者false;
3.nextBytes(byte[] bytes)
唯一的获得随机数但是没有返回值的方法,因为返回值会被存进作为参数的bytes数组中。
代码: import java.util.Random; public class TestRandom { public static void main(String[] args) { // 获得随机数对象 Random random = new Random(); // 新建byte数组,同时设定生成的byte数的个数 byte[] bytes = new byte[10]; // 存入随机数组 random.nextBytes(bytes); // 遍历输出 for (byte b : bytes) { System.out.println("byte:" + b); } } }
输出: byte:12 byte:96 byte:109 byte:-124 byte:-18 byte:39 byte:-14 byte:44 byte:36 byte:-22
4.nextDouble()
随机返回一个0.0d(包括)到 1.0d(不包括)范围内的double值。
5.nextFloat()
随机返回一个0.0f(包括)到 1.0f(包括)范围内的float值。
6.nextInt()
在int对象取值范围内随机生成一个int类型随机数返回。
7.nextInt(int n)
返回一个在 0(包括)和指定值(不包括)之间均匀分布的 int 值
8.nextLong()
在long对象取值范围随机生成一个long类型随机数返回
9.nextGaussian()
高斯分布的doule类型随机数,其平均值是 0.0,标准差是 1.0。相信我,除了少数一些人,基本上用不到。
10.setSeed(long seed)
设置随机数种子,因为Random生成随机数都是基于一个真随机数生成的伪随机数,这个就是他的种子。一般不会用到的,有人想用到话,可以参考这种方法
import java.util.Random;public class TestRandom { public static void main(String[] args) { // 获得随机数对象 Random random = new Random(); // 设置种子 random.setSeed(20); // 用设置了种子的随机数对象生成100以内的随机数,0~99 int i = random.nextInt(100); }}
Math对象获得随机数
Math获得随机数只有一种方式,调用该类的random()方法,随机产生一个大于等于 0.0 且小于 1.0的double类型小数值
代码:
public class TestRandom { public static void main(String[] args) { // 获得随机数 double random = Math.random(); // 输出信息 System.out.println("This is a random for double:"+random); }}
输出:
This is a random for double:0.14258442581708097
处理小数位
很明显,这里出现了一个状况,那就是double类型的随机数小数位过长,用来输出简直……
好吧 ,丧心病狂,而且因为很多人一般都是自定义一个小数,然后赋值给double或者float类型的变量。所以我就把我用的方法总结了一下。各位看自己情况来使用吧。
直接格式化输出
这个是常用,一般控制台输出都是直接这样输出,因为我是做Android开发的,所以这种输出对我来说并不是最好的,但是方便各位,就写在前面了。
代码: public class TestRandom { // 这种格式化会自动四舍五入,并不是单纯的掐掉尾巴 public static void main(String[] args) { // 定义两个变量用以测试 double d1 = 0.125; double d2 = 0.124; // 直接格式化输出,这里的printf是正确的,不是我打错了。 System.out.printf("%.2f", d1); // 因为不使用println就没有自动换行的效果,所以就加上换行符 System.out.print("\n"); System.out.printf("%.2f", d2); } }
输出: 0.13 0.12
类型转换(n.0格式)
这种是比较适合初学者来用的,简单易懂。但是处理效果不佳。因为虽然保留着小数的样子,但是.0固定结尾其实对我们来说还有什么意义呢。但是你不得不承认,某些情况下,会有这种要求的。
但是有个问题就是,这样转换,相当于直接把小数点后面的抹掉,哪怕是n.99输出结果也是n.0,而不是n+1
代码:public class TestRandom { public static void main(String[] args) { // 定义double变量 double d = 5.925; // 强制转换成int类型。 int i=(int) d; // 转回double类型。 double d2=i; // 输出查看 System.out.println(d2); }}
输出: 5.0
类型转换(n.m格式)
这个方法比较作弊,也是我一直在用的,毕竟在Android平台,new对象是一种比较占用内存的方式,为了节省内存,我一般会这样处理。
但是作弊的方法,还是有缺点的,因为是上一种方法的变种,所以这个方法依然不会四舍五入,而是抹除所多余的小数位
代码: public class TestRandom { public static void main(String[] args) { // 定义double变量 double d = 5.925; // 根据小数位,有几位,乘以10的几次方,强制转换成int类型。 int i = (int) (d * 100); // 转回double类型,然后将乘上的数重新除去。 double d2 = (double)i / 100; // 输出查看 System.out.println(d2); } }
输出: 5.92
数字格式化对象(NumberFormat)
数字格式化,通过方法格式化,可以对多种状态使用,但是本身使用不好理解。
代码: import java.text.NumberFormat; public class TestRandom { public static void main(String[] args) { // 定义double变量 double d = 5.925555555; // 抽象类方法,构造方法因为被protected了,所以只能通过静态方法获得。 NumberFormat Nformat=NumberFormat.getInstance(); // 设置小数位数。 Nformat.setMaximumFractionDigits(2); // 执行格式化转换。 String string = Nformat.format(d); // 输出查看 System.out.println(string); } }
输出: 5.93
十进制数字格式化对象(DecimalFormat)
十进制的格式化器
代码: import java.text.DecimalFormat; public class TestRandom { public static void main(String[] args) { // 定义double变量 double d = 15.925555555; // 新建格式化器,设置格式 DecimalFormat Dformat=new DecimalFormat("0.00"); // 根据格式化器格式化数据 String string=Dformat.format(d); // 输出信息确认 System.out.println(string); } }
输出: 15.93
16位以上数据为了保证精度(BigDecimal)
这个放在最后不是因为不重要,只是用来格式化的话,有些屈才了,他是用来对超过16位有效位的数进行精确的运算的。里面功能很丰富,属于java.math包
处理结果还是double类型,如果需要,可以保留计算。
代码: import java.math.BigDecimal; public class TestRandom { public static void main(String[] args) { // 定义double变量 double d = 15.925555555; // 新建格式化器,设置格式 BigDecimal decimal=new BigDecimal(d); // 将数据四舍五入为两位小说的double值 double d2=decimal.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue(); // 输出信息确认 System.out.println(d2); } }
输出: 15.93
顺便附注一个话题,将字符串转换浮点数,精度天生就会出现偏差的,因为浮点数存储的并不是真正的我们看到的数,而是经过偏移转换的近似值。所以才会有上面BigDecimal对象,如果需要计算浮点数,最好使用BigDecimal对象。
- Java控制小数位,获得随机数
- 小数位控制
- java求指定范围和小数位的随机数
- Java如何获得一个随机数
- java获得随机数的方法
- 小数位输出控制
- C++ 控制小数位
- Java获得随机数的几种方法
- 获得随机数
- 获得随机数
- 获得随机数
- 获得随机数
- 控制小数位的另一种方法
- java格式化小数位
- JAVA保留小数位
- java小数位处理
- java之小数位截取
- java保留小数位方法
- 如何在 CentOS 7 用 cPanel 配置 Nginx 反向代理
- codeforcse基础题——#357(div2)C
- 送给大一新生的一些话
- 简单记事本的实现(JAVA)
- Android Logger 日志框架源码分析
- Java控制小数位,获得随机数
- Linux基本操作命令总结以及目录结构图解
- Nginx源码安装及调优配置
- 【Android-I】Android开发之常见错误:Dx unsupported class file version 52.0...while parsing com/...
- Java学习心得(一)
- vuln - SugarCRM 6.5.23 - REST PHP Object Injection Exploit
- 占位
- 依然还是我
- 后台启动数据库