• java 大数据处理类 BigDecimal 解析


    这两天,由于我的必修课概率论里经常要用到排列组合的计算,感觉很麻烦,加上现代智能手机的计算器是没有这方面功能的。

    所以,就自己动手写了个安卓的 排列组合 计算器,用了一天,发现有很大的问题,阶乘达百亿级别的数,程序将不再运行。

    我这里举个例子,30的阶乘,30!=1x2x3x4x5....x30,这个明显是超出了整型 int 的范围了。

    心想,试试长整型吧,后来发现,8字节的long 也是杯水车薪。

    无奈求助百度,发现个好东西,BigDecimal 类。

    查看了若干相关博文,发现全 TM 是复制粘贴文档的,我是服了,没有那一篇是有个人见解的,直接copy文档

    demo例子不够清晰,看着真是蛋疼,从头到尾,只说它是怎么怎么滴,用法介绍无力吐槽。

    不相信的,直接百度看看,再回头对比我这里的讲解。下面全代码注释。

    例子不会举太多,但是,我保证,看懂了这一个,其他的绝对会用。

     1 View.OnClickListener count = new View.OnClickListener() {
     2         @Override
     3         public void onClick(View v) {
     4             //m1、n1用于直接由Sring 转为 int 判断输入的合法性,不作运算
     5             int m1,n1;
     6             //BigDecimal有很多个初始化方法,我这里列举一个,在初始化类对象的同时,传入数字字符串,此时的对象值为该数字
     7             //下面的 m、n 都是 1 ,因为我的这个监听事件的运算是从 1 开始的。
     8 
     9             BigDecimal m = new BigDecimal("1");
    10             BigDecimal n = new BigDecimal("1");
    11 
    12             BigDecimal result_2 = new BigDecimal("1");//这个用来保存 m!/(m-n)!n! 中的 m-n 阶乘 从1开始
    13             Toast.makeText(MyActivity.this,save_m+"***"+save_switch+"///"+save_n,Toast.LENGTH_LONG).show();
    14 
    15             m1 = Integer.parseInt(save_m);//save_m 和 下面的 save_n 都是 editText 输入获取的值
    16             n1 = Integer.parseInt(save_n);
    17             if(m1<0 || n1<0 || m1 < n1){
    18                 t3.setText("保持 m>=0,n>=0,且 m >n,组合计算请保持 m<900,n<900");
    19             }else {
    20                 //太大,运算速度有延迟,几千亿的数运算,计算机都要几个秒
    21                 if(save_switch.equals("组合")  || n1>900 || m1>900) {
    22                     t3.setText("组合计算请保持 m<900,n<900");
    23                 }else {
    24                     if (save_switch.equals("组合")) {
    25                         //long result_1 = 1, result_2 = 1, result = 1;//long 都不够用
    26                         for (int i = 1; i <= m1; i++) {
    27                             Log.d("tag", "before * m is " + m + ":" + "i is " + i);
    28 
    29                             //BigDecimal 类方法,乘法,这里的乘包括同门的加、减、除,不再是+、-、*、/
    30                             //常用乘法: multiply(BigDecimal xx),四个都有返回值,返回类型也是 BigDecimal
    31                             //下面这行是个例子
    32                             m = m.multiply(BigDecimal.valueOf(i));//每次乘 i
    33                             // 我上面的 BigDecimal.valueOf(i) 这个是用于把 int 类型的 i转为 BigDecimal 对象传入
    34 
    35                             if (i <= n1) {
    36                                 Log.d("tag", "before * n is " + n + ":" + "i is " + i);
    37                                 n = n.multiply(BigDecimal.valueOf(i));
    38                             }
    39                             if (i <= (m1 - n1)) {
    40                                 Log.d("tag", "before * result_2 is " + result_2 + ":" + "i is " + i);
    41                                 result_2 = result_2.multiply(BigDecimal.valueOf(i));
    42                             }
    43                             Log.d("tag", "-" + result_2);
    44                         }
    45                         Log.d("tag", "m->" + m);
    46                         Log.d("tag", "n->" + n);
    47                         Log.d("tag", "r->" + result_2);
    48                         // 除法: divide(),用法参照上面的乘法
    49                         m = m.divide(n.multiply(result_2));
    50                         t3.setText("Result is:" + m + ";");
    51                     }
    52                 }
    53                 if(save_switch.equals("排列")){
    54                     Toast.makeText(MyActivity.this,"789798",Toast.LENGTH_LONG).show();
    55                     //int result_1 = 1, result_2 = 1, result = 1;
    56                     for (int i = 1; i <= m1; i++) {
    57                        // Log.d("tag","is->"+result);
    58                         m = m.multiply(BigDecimal.valueOf(i));
    59                         Log.d("tag","i->"+i);
    60                         if (i <= (m1 - n1)) {
    61                             result_2 = result_2.multiply(BigDecimal.valueOf(i));
    62                         }
    63                     }
    64                     //t3.setText("For double is:" + result + ";" + "For FenShu is:" + result_2);
    65                     m = m.divide(result_2);
    66                     t3.setText("Result is:" + m + ";");
    67                 }
    68             }
    69         }
    70     };

    BigDecimal 可运算的 数级 可 达到 70多位,可能更多,十进制哦。

  • 相关阅读:
    SSH 连接超时解决办法
    alter system switch logfile和alter system archive log current 的区别
    Oracle 删除归档日志脚本
    Oracle 11g 新特性简介
    Oracle sqlplus 常用命令总结
    Oracle 11g 新特性简介
    计算文件的MD5值上传到服务器 下载验证文件是否被篡改
    看不下去的代码放这有机会用手机看。。。
    C++ Primer第一章学习笔记——C++初邂逅
    OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui
  • 原文地址:https://www.cnblogs.com/linguanh/p/4342933.html
Copyright © 2020-2023  润新知