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的热门话题分析
目录
相关文章
Java 大视界 -- 基于 Java 的大数据实时数据处理在车联网车辆协同控制中的应用与挑战(197)
本文深入探讨了基于 Java 的大数据实时数据处理在车联网车辆协同控制中的关键应用与技术挑战。内容涵盖数据采集、传输与实时处理框架,并结合实际案例分析了其在车辆状态监测、交通优化与协同驾驶中的应用效果,展示了 Java 大数据技术在提升交通安全性与效率方面的巨大潜力。
|
存储 搜索推荐 算法
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
本文深入探讨了Java大数据技术在智能金融理财产品风险评估与个性化配置中的关键应用。通过高效的数据采集、存储与分析,Java大数据技术助力金融机构实现精准风险评估与个性化推荐,提升投资收益并降低风险。
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
|
存储 供应链 数据可视化
Java 大视界 -- 基于 Java 的大数据可视化在企业供应链风险预警与决策支持中的应用(204)
本篇文章探讨了基于 Java 的大数据可视化技术在企业供应链风险预警与决策支持中的深度应用。文章系统介绍了从数据采集、存储、处理到可视化呈现的完整技术方案,结合供应链风险预警与决策支持的实际案例,展示了 Java 大数据技术如何助力企业实现高效、智能的供应链管理。
Java 大视界 -- Java 大数据在智能医疗手术风险评估与术前方案制定中的应用探索(203)
本文探讨了Java大数据技术在智能医疗手术风险评估与术前方案制定中的创新应用。通过多源数据整合、智能分析模型构建及知识图谱技术,提升手术风险预测准确性与术前方案制定效率,助力医疗决策智能化,推动精准医疗发展。
|
机器学习/深度学习 Java 大数据
Java 大视界 -- Java 大数据在智能政务公共资源交易数据分析与监管中的应用(202)
本篇文章深入探讨了 Java 大数据在智能政务公共资源交易监管中的创新应用。通过构建高效的数据采集、智能分析与可视化决策系统,Java 大数据技术成功破解了传统监管中的数据孤岛、效率低下和监管滞后等难题,为公共资源交易打造了“智慧卫士”,助力政务监管迈向智能化、精准化新时代。
|
数据采集 机器学习/深度学习 Java
Java 大视界 -- Java 大数据在智能体育赛事运动员体能监测与训练计划调整中的应用(200)
本篇文章聚焦 Java 大数据在智能体育赛事中对运动员体能监测与训练计划的智能化应用。通过构建实时数据采集与分析系统,结合机器学习模型,实现对运动员体能状态的精准评估与训练方案的动态优化,推动体育训练迈向科学化、个性化新高度。
|
机器学习/深度学习 分布式计算 Java
Java 大视界 -- Java 大数据机器学习模型在遥感图像土地利用分类中的优化与应用(199)
本文探讨了Java大数据与机器学习模型在遥感图像土地利用分类中的优化与应用。面对传统方法效率低、精度差的问题,结合Hadoop、Spark与深度学习框架,实现了高效、精准的分类。通过实际案例展示了Java在数据处理、模型融合与参数调优中的强大能力,推动遥感图像分类迈向新高度。
Java 大视界 -- Java 大数据在智能家居能源消耗模式分析与节能策略制定中的应用(198)
简介:本文探讨Java大数据技术在智能家居能源消耗分析与节能策略中的应用。通过数据采集、存储与智能分析,构建能耗模型,挖掘用电模式,制定设备调度策略,实现节能目标。结合实际案例,展示Java大数据在智能家居节能中的关键作用。
|
存储 搜索推荐 算法
Java 大视界 -- Java 大数据在智慧文旅旅游线路规划与游客流量均衡调控中的应用实践(196)
本实践案例深入探讨了Java大数据技术在智慧文旅中的创新应用,聚焦旅游线路规划与游客流量调控难题。通过整合多源数据、构建用户画像、开发个性化推荐算法及流量预测模型,实现了旅游线路的精准推荐与流量的科学调控。在某旅游城市的落地实践中,游客满意度显著提升,景区流量分布更加均衡,充分展现了Java大数据技术在推动文旅产业智能化升级中的核心价值与广阔前景。
|
存储 分布式计算 算法
Java 大视界 -- Java 大数据在智能教育在线考试监考与作弊检测中的技术创新(193)
本文探讨了Java大数据技术在智能教育在线考试监考与作弊检测中的创新应用。随着在线考试的普及,作弊问题日益突出,传统监考方式难以应对。通过Java大数据技术,可实现考生行为分析、图像识别等多维度监控,提升作弊检测的准确性与效率。结合Hadoop与Spark等技术,系统能实时处理海量数据,构建智能监考体系,保障考试公平性,推动教育评价体系的数字化转型。

推荐镜像

更多
  • DNS