java 中的小数点、大数、随机数处理
1.小数点处理
public class Test {
public static void main(String[] args) {
double i = 3.856;
// 舍掉小数取整
System.out.println("舍掉小数取整:Math.floor(3.856)=" + (int) Math.floor(i));
// 四舍五入取整
System.out.println("四舍五入取整:(3.856)="
+ new BigDecimal(i).setScale(0, BigDecimal.ROUND_HALF_UP));
// 四舍五入保留两位小数
System.out.println("四舍五入取整:(3.856)="
+ new BigDecimal(i).setScale(2, BigDecimal.ROUND_HALF_UP));
// 凑整,取上限
System.out.println("凑整:Math.ceil(3.856)=" + (int) Math.ceil(i));
// 舍掉小数取整
System.out.println("舍掉小数取整:Math.floor(-3.856)=" + (int) Math.floor(-i));
// 四舍五入取整
System.out.println("四舍五入取整:(-3.856)="
+ new BigDecimal(-i).setScale(0, BigDecimal.ROUND_HALF_UP));
// 四舍五入保留两位小数
System.out.println("四舍五入取整:(-3.856)="
+ new BigDecimal(-i).setScale(2, BigDecimal.ROUND_HALF_UP));
// 凑整,取上限
System.out.println("凑整(-3.856)=" + (int) Math.ceil(-i));
2.大数处理
2.1 BigInteger
Java中在BigInteger类中封装了多种操作,除了基本的加、减、乘、除操作之外,还提供了绝对值、相反数、最大公约数以及判断是否为质数等操作。 当使用BigInteger类时,可以实例化一个BigInteger对象,并自动调用相应的构造函数。BigInteger类具有很多构造函数,但最直接的一种方式是参数以字符串形式代表要处理的数字;
BigDecimal和BigInteger都能实现大数字的运算,不同的是BigDecimal加入了小数的概念。一般的float型和double型数据只可以用来做科学计算或工程计算,但由于在商业计算中要求数字精度比较高,所以要用到java.math.BigDecimal类。BigDecimal类支持任何精度的定点数,可以用它来精确计算货币值。
例:
public class BigIntegerDemo {
public static void main(String[] args) {
BigInteger bigInstance = new BigInteger("4"); // 实例化一个大数字
// 取该大数字加2的操作
System.out.println("加法操作:" + bigInstance.add(new BigInteger("2")));
// 取该大数字减2的操作
System.out.println("减法操作:"
+ bigInstance.subtract(new BigInteger("2")));
// 取该大数字乘以2的操作
System.out.println("乘法操作:"
+ bigInstance.multiply(new BigInteger("2")));
// 取该大数字除以2的操作
System.out.println("除法操作:"
+ bigInstance.divide(new BigInteger("2")));
// 取该大数字除以3的商
System.out.println("取商:"
+ bigInstance.divideAndRemainder(new BigInteger("3"))[0]);
// 取该大数字除以3的余数
System.out.println("取余数:"
+ bigInstance.divideAndRemainder(new BigInteger("3"))[1]);
// 取该大数字的2次方
System.out.println("做2次方操作:" + bigInstance.pow(2));
// 取该大数字的相反数
System.out.println("取相反数操作:" + bigInstance.negate());
}
}
运行结果;
加法操作:6
减法操作:2
乘法操作:8
除法操作:2
取商:1
取余数:1
做2次方操作:16
取相反数操作:-4
2.2BigDecimal
双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。表5.7中列出了BigDecimal类的主要构造器和方法。
BigDecimal类的主要构造器和方法
(1)构造器描 述
BigDecimal(int)创建一个具有参数所指定整数值的对象。
BigDecimal(double)创建一个具有参数所指定双精度值的对象。
BigDecimal(long)创建一个具有参数所指定长整数值的对象。
BigDecimal(String)创建一个具有参数所指定以字符串表示的数值的对象。
(2)方 法描 述
add(BigDecimal)BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal)BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal)BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal)BigDecimal对象中的值相除,然后返回这个对象。
toString()将BigDecimal对象的数值转换成字符串。
doublue()将BigDecimal对象中的值以双精度数返回。
floatValue()将BigDecimal对象中的值以单精度数返回。
longValue()将BigDecimal对象中的值以长整数返回。
intValue()将BigDecimal对象中的值以整数返回。
注意,由于一般数值类型,例如double,不能准确地代表16位有效数以上的数字,在使用BigDecimal时,应用BigDecimal(String)构造器创建对象才有意义。另外,BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。
构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。关于构造器概念和编写技术,将在本书第6章详细介绍。
下面讨论BigDecimal的一些常用例子:
//完整程序例子在本书配套资源目录Ch5中名为BigDecimalTestApp.Java
//创建BigDecimal对象
BigDecimal bigNumber = new BigDecimal("89.1234567890123456789");
BigDecimal bigRate = new BigDecimal(1000);
BigDecimal bigResult = new BigDecimal(); //对象bigResult的值为0.0
//对bigNumber的值乘以1000,结果 赋予bigResult
bigResult = bigNumber.multiply(bigRate);
System.out.println(bigResult.toString());
//或者System.out.println(bigResult);
//显示结果:89123.4567890123456789000
//以双精度数返回bigNumber中的值
double dData = bigNumber.doublue();
System.out.println(dData); //结果:89.12345678901235
注意使用方法doublue()将对象bigNumber中的值以双精度数值返回时,将丢失数据的准确性。使用其他方法,如xxxValue()时均存在这个问题,使用时必须慎重。
<!--[if !vml]--><!--[endif]-->3W BigDecimal用来对超过16有效位以上的数值进行运算和操作。所有的算术运算都通过调用其相应的方法进行。创建一个超过16有效位数的对象时,运用BigDecimal(String)才可避免丢失数字的精确度。
(3)BigDecimal和格式化
由于NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制。
3.随机数
3.1 random()方法
在Math类中存在一个random()方法,用于产生随机数字,这个方法默认生成大于等于0.0小于1.0的double型随机数,即0<=Math.random()<1.0,虽然Math.random()方法只可以产生0~1之间的double型数字,其实只要在Math.random()语句上稍加处理,就可以使用这个方法产生任意范围的随机数。

例:
public class MathRondom {
/**
* 定义产生偶数的方法
* @param num1 起始范围参数
* @param num2 终止范围参数
* @return 随即的范围内偶数
*/
public static int GetEvenNum(double num1, double num2) {
// 产生num1~num2之间的随机数
int s = (int) num1 + (int) (Math.random() * (num2 - num1));
if (s % 2 == 0) { // 判断随机数是否为偶数
return s; // 返回
} else
// 如果是奇数
return s + 1; // 将结果加1后返回
}
public static void main(String[] args) {
// 调用产生随机数方法
System.out.println("任意一个2~32之间的偶数:" + GetEvenNum(2, 32));
}
}
运行结果:
任意一个2~32之间的偶数:18 (或指定范围内其他数字)
分析:同上述方法一致,也可以产生a~z之间的字符串 (char)('a'+Math.random()*('z' - 'a' + 1));
或A~Z之间的随机数 (char)(char1+Math.random()*(char2 - char1 +1));例如下面的代码:
public class MathRandomChar {
// 定义获取任意字符之间的随机字符
public static char GetRandomChar(char cha1, char cha2) {
return (char) (cha1 + Math.random() * (cha2 - cha1 + 1));
}
public static void main(String[] args) {
// 获取a~z之间的随机字符
System.out.println("任意小写字符" + GetRandomChar('a', 'z'));
// 获取A~Z之间的随机字符
System.out.println("任意大写字符" + GetRandomChar('A', 'Z'));
// 获取0~9之间的随机字符
System.out.println("0到9任意数字字符" + GetRandomChar('0', '9'));
}
}
运行结果:
任意小写字符p
任意大写字符X
0到9任意数字字符9(或其他结果)
3.2.Random类
除了Math类中的random()方法可以获取随机数之外,在Java中还提供了一种可以获取随机数的方式,那就是java.util.Random类。可以通过实例化一个Random对象创建一个随机数生成器。 语法如下: Random r=new Random(); 其中,r是指Random对象。例如下面代码:
public class RandomDemo {
public static void main(String[] args) {
Random r = new Random(); // 实例化一个Random类
// 随机产生一个整数
System.out.println("随机产生一个整数:" + r.nextInt());
// 随机产生一个大于等于0小于10的整数
System.out.println("随机产生一个大于等于0小于10的整数:" + r.nextInt(10));
// 随机产生一个布尔型的值
System.out.println("随机产生一个布尔型的值:" + r.nextBoolean());
// 随机产生一个双精度型的值
System.out.println("随机产生一个双精度型的值:" + r.nextDouble());
// 随机产生一个浮点型的值
System.out.println("随机产生一个浮点型的值:" + r.nextFloat());
// 随机产生一个概率密度为高斯分布的双精度值
System.out.println("随机产生一个概率密度为高斯分布的双精度值:"
+ r.nextGaussian());
}
}
运行结果:
随机产生一个整数:1007862560
随机产生一个大于等于0小于10的整数:3
随机产生一个布尔型的值:false
随机产生一个双精度型的值:0.7102648045789365
随机产生一个浮点型的值:0.31149262
随机产生一个概率密度为高斯分布的双精度值:-0.2646002913429201
java 中的小数点、大数、随机数处理的更多相关文章
- JAVA中生成指定位数随机数的方法总结
JAVA中生成指定位数随机数的方法很多,下面列举几种比较常用的方法. 方法一.通过Math类 public static String getRandom1(int len) { int rs = ( ...
- java中大数类的学习
java中提供了大数类BigInteger和BigDecimal分别表示大整数类和大浮点数类,这两个类都在java.math.*包中,因此每次必须在开头处引用该包. 一.BigInteger构造函数: ...
- java中Random(long seed)方法与rRandom()方法的使用产生随机数
Random 类作为JAVA中用于产生的随机数 ,new Random(10) :10是种子数. 注意:Random 的一个特点是:相同种子数的Random对象,对应相同次数生成的随机数字是完全相 ...
- 为什么说Java中的随机数都是伪随机数?
什么是伪随机数? 1.伪随机数是看似随机实质是固定的周期性序列,也就是有规则的随机. 2.只要这个随机数是由确定算法生成的,那就是伪随机,只能通过不断算法优化,使你的随机数更接近随机. (随机这 ...
- Java中随机数的产生方式与原理
查阅随机数相关资料,特做整理 首先说一下java中产生随机数的几种方式 在j2se中我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以 ...
- Java中的大数处理类BigInteger和BigDecimar浅析
这两个类位于java.math包内,要使用它们必须在类前面引用该包:import java.math.BigInteger;和import java.math.BigDecimal; BigInteg ...
- 论 Java 中获取一组不重复的随机数之性能问题
今天在做一个Java项目, 用到了使用一组不重复的随机数问题, 不管怎么做随机数里面总有几个是重复的. 于是上网去找资料, 在网上找到的资料中大部分都是一个思路: 网上的思路一:(性能不理想) 先生成 ...
- Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom 文中的 Random即:java.util.Random,ThreadLocalRandom 即: ...
- Java中产生随机数的两个方法
Java中产生随机数的两个方法 一.利用random方法来生成Java随机数. 在Java语言中生成Java随机数相对来说比较简单,因为有一个现成的方法可以使用.在Math类中,Java语言提供了一个 ...
随机推荐
- Activity LauchMode设置
lauchMode: standard: 标准模式,每次调用startActivity()方法就会产生一个新的实例. singleTop: 如果已经有一个实例位于Activit ...
- Javascript里EQ、NE、GT、LT、GE、LE含义
EQ 就是 EQUAL等于 NE就是 NOT EQUAL不等于 GT 就是 GREATER THAN大于 LT 就是 LESS THAN小于 GE 就是 GREATER THAN OR EQUAL ...
- spring boot 环境配置(profile)切换
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- Spring框架之一 读取配置文件
以下代码都是来源于官方源码(Spring-4.3.18.RELEASE),此处只是为自己以后深啃先布局出大概流程,请各看官不要浪费时间看 说明: .. 表示省略代码, // 后的如果不是源码自带则为当 ...
- Sequence Models Week 1 Improvise a Jazz Solo with an LSTM Network
Improvise a Jazz Solo with an LSTM Network Welcome to your final programming assignment of this week ...
- 使用idea断点调试时出现no executable code found at line问题
问题描述 今天突然碰到了这样的一个问题: 使用断点调试时,断点的地方出现了一个叉号,而不是对勾,这就让我非常无奈了. 调了一天,终于把这个问题解决了,还是要记录一下的. 问题情况如下: 除了这里,de ...
- NOI2019退役记
Day0 时光荏苒,日月如梭.人生中第二次也是最后一次全国赛开始了. 坐6h高铁+1h大巴来到gzez,热死.室友是A类的Gloid和C类的仓鼠,我寝室是为数不多(或许只有1个)的凑齐了ABC三种类别 ...
- luogu P4219 [BJOI2014]大融合
题解:原来LCT也能维护子树信息,我太Naive了 用LCT维护当前子树节点个数 具体做法维护siz[x]=当前Splay子树和指向当前Splay子树的虚边所代表的节点个数 auxsiz[x]=指向x ...
- Go get unrecognized import path "gopkg.in/yaml.v2"
安装gin: go get -u github.com/gin-gonic/gin 出现错误: package gopkg.in/yaml.v2: unrecognized import path & ...
- [Security] Web Security Essentials
In this course, we'll learn how to exploit and then mitigate several common Web Security Vulnerabili ...