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多位,可能更多,十进制哦。

 

如果您认为这篇文章还不错或者有所收获,您可以通过扫描一下下面的支付宝二维码 打赏我一杯咖啡【物质支持】,也可以点击右下角的【推荐】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力


img_12e3f54d4d0f70f0eb14f20548e3d781.png
相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
目录
相关文章
|
7月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
296 4
|
7月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
7月前
|
存储 安全 Java
《数据之美》:Java集合框架全景解析
Java集合框架是数据管理的核心工具,涵盖List、Set、Map等体系,提供丰富接口与实现类,支持高效的数据操作与算法处理。
|
7月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
347 5
|
7月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
373 1
|
7月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
488 1
|
7月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
309 0
|
7月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
350 1
|
SQL JSON 分布式计算
23篇大数据系列(一)java基础知识全集(下)(2万字干货,建议收藏)
23篇大数据系列(一)java基础知识全集(下)(2万字干货,建议收藏)
23篇大数据系列(一)java基础知识全集(下)(2万字干货,建议收藏)
|
SQL JSON 分布式计算
23篇大数据系列(一)java基础知识全集(上)(2万字干货,建议收藏)
23篇大数据系列(一)java基础知识全集(2万字干货,建议收藏)
23篇大数据系列(一)java基础知识全集(上)(2万字干货,建议收藏)

推荐镜像

更多
  • DNS