zoukankan      html  css  js  c++  java
  • java 中的小数点、大数、随机数处理

    1.小数点处理

     1 public class Test { 
     2 
     3 public static void main(String[] args) {
     4 
     5 double i = 3.856;
     6 
     7 // 舍掉小数取整 
     8 System.out.println("舍掉小数取整:Math.floor(3.856)=" + (int) Math.floor(i));
     9 
    10 // 四舍五入取整 
    11 System.out.println("四舍五入取整:(3.856)=" 
    12 + new BigDecimal(i).setScale(0, BigDecimal.ROUND_HALF_UP));
    13 
    14 // 四舍五入保留两位小数 
    15 System.out.println("四舍五入取整:(3.856)=" 
    16 + new BigDecimal(i).setScale(2, BigDecimal.ROUND_HALF_UP));
    17 
    18 // 凑整,取上限 
    19 System.out.println("凑整:Math.ceil(3.856)=" + (int) Math.ceil(i));
    20 
    21 // 舍掉小数取整 
    22 System.out.println("舍掉小数取整:Math.floor(-3.856)=" + (int) Math.floor(-i)); 
    23 // 四舍五入取整 
    24 System.out.println("四舍五入取整:(-3.856)=" 
    25 + new BigDecimal(-i).setScale(0, BigDecimal.ROUND_HALF_UP));
    26 
    27 // 四舍五入保留两位小数 
    28 System.out.println("四舍五入取整:(-3.856)=" 
    29 + new BigDecimal(-i).setScale(2, BigDecimal.ROUND_HALF_UP));
    30 
    31 // 凑整,取上限 
    32 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类支持任何精度的定点数,可以用它来精确计算货币值。

    例:

     1 public class BigIntegerDemo {
     2     public static void main(String[] args) {
     3         BigInteger bigInstance = new BigInteger("4"); // 实例化一个大数字
     4         // 取该大数字加2的操作
     5         System.out.println("加法操作:" + bigInstance.add(new BigInteger("2")));
     6         // 取该大数字减2的操作
     7         System.out.println("减法操作:"
     8                 + bigInstance.subtract(new BigInteger("2")));
     9         // 取该大数字乘以2的操作
    10         System.out.println("乘法操作:"
    11                 + bigInstance.multiply(new BigInteger("2")));
    12         // 取该大数字除以2的操作
    13         System.out.println("除法操作:"
    14                 + bigInstance.divide(new BigInteger("2")));
    15         // 取该大数字除以3的商
    16         System.out.println("取商:"
    17                 + bigInstance.divideAndRemainder(new BigInteger("3"))[0]);
    18         // 取该大数字除以3的余数
    19         System.out.println("取余数:"
    20                 + bigInstance.divideAndRemainder(new BigInteger("3"))[1]);
    21         // 取该大数字的2次方
    22         System.out.println("做2次方操作:" + bigInstance.pow(2));
    23         // 取该大数字的相反数
    24         System.out.println("取相反数操作:" + bigInstance.negate());
    25     }
    26 }

    运行结果;

    加法操作: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()语句上稍加处理,就可以使用这个方法产生任意范围的随机数。

        

      例:

     1 public class MathRondom {
     2     /**
     3      * 定义产生偶数的方法
     4      * @param num1 起始范围参数
     5      * @param num2 终止范围参数
     6      * @return 随即的范围内偶数
     7      */
     8     public static int GetEvenNum(double num1, double num2) {
     9         // 产生num1~num2之间的随机数
    10         int s = (int) num1 + (int) (Math.random() * (num2 - num1)); 
    11         if (s % 2 == 0) { // 判断随机数是否为偶数
    12             return s; // 返回
    13         } else
    14             // 如果是奇数
    15             return s + 1; // 将结果加1后返回
    16     }
    17     
    18     public static void main(String[] args) {
    19         // 调用产生随机数方法
    20         System.out.println("任意一个2~32之间的偶数:" + GetEvenNum(2, 32));
    21     }
    22 }

      运行结果:

      任意一个2~32之间的偶数:18   (或指定范围内其他数字)

      分析:同上述方法一致,也可以产生a~z之间的字符串    (char)('a'+Math.random()*('z' - 'a' + 1));

      或A~Z之间的随机数  (char)(char1+Math.random()*(char2 - char1 +1));例如下面的代码:

      

     1 public class MathRandomChar {
     2     // 定义获取任意字符之间的随机字符
     3     public static char GetRandomChar(char cha1, char cha2) {
     4         return (char) (cha1 + Math.random() * (cha2 - cha1 + 1));
     5     }
     6     
     7     public static void main(String[] args) {
     8         // 获取a~z之间的随机字符
     9         System.out.println("任意小写字符" + GetRandomChar('a', 'z'));
    10         // 获取A~Z之间的随机字符
    11         System.out.println("任意大写字符" + GetRandomChar('A', 'Z'));
    12         // 获取0~9之间的随机字符
    13         System.out.println("0到9任意数字字符" + GetRandomChar('0', '9'));
    14     }
    15 }

      运行结果:

      任意小写字符p
      任意大写字符X
      0到9任意数字字符9(或其他结果

    3.2.Random类

      除了Math类中的random()方法可以获取随机数之外,在Java中还提供了一种可以获取随机数的方式,那就是java.util.Random类。可以通过实例化一个Random对象创建一个随机数生成器。 语法如下: Random r=new Random(); 其中,r是指Random对象。例如下面代码:

      

     1 public class RandomDemo {
     2     public static void main(String[] args) {
     3         Random r = new Random(); // 实例化一个Random类
     4         // 随机产生一个整数
     5         System.out.println("随机产生一个整数:" + r.nextInt());
     6         // 随机产生一个大于等于0小于10的整数
     7         System.out.println("随机产生一个大于等于0小于10的整数:" + r.nextInt(10));
     8         // 随机产生一个布尔型的值
     9         System.out.println("随机产生一个布尔型的值:" + r.nextBoolean());
    10         // 随机产生一个双精度型的值
    11         System.out.println("随机产生一个双精度型的值:" + r.nextDouble());
    12         // 随机产生一个浮点型的值
    13         System.out.println("随机产生一个浮点型的值:" + r.nextFloat());
    14         // 随机产生一个概率密度为高斯分布的双精度值
    15         System.out.println("随机产生一个概率密度为高斯分布的双精度值:"
    16                 + r.nextGaussian());
    17     }
    18 }

      运行结果:

    随机产生一个整数:1007862560
    随机产生一个大于等于0小于10的整数:3
    随机产生一个布尔型的值:false
    随机产生一个双精度型的值:0.7102648045789365
    随机产生一个浮点型的值:0.31149262
    随机产生一个概率密度为高斯分布的双精度值:-0.2646002913429201

     

  • 相关阅读:
    委托和异步方法
    线程池_ThreadPool
    委托_deleget
    一步一步实现视频播放器client(二)
    mysql忘记password
    POJ 2456 Aggressive cows (二分 基础)
    Fragment小结
    Cocos2d-x粒子系统
    淘宝数据库OceanBase SQL编译器部分 源代码阅读--解析SQL语法树
    C与C++在形參的一点小差别
  • 原文地址:https://www.cnblogs.com/xyzyj/p/6123812.html
Copyright © 2011-2022 走看看