java 大数据处理类 BigDecimal 解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云解析 DNS,旗舰版 1个月
简介: 这两天,由于我的必修课概率论里经常要用到排列组合的计算,感觉很麻烦,加上现代智能手机的计算器是没有这方面功能的。 所以,就自己动手写了个安卓的 排列组合 计算器,用了一天,发现有很大的问题,阶乘达百亿级别的数,程序将不再运行。

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

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

我这里举个例子,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的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
16天前
|
存储 缓存 安全
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
28 6
|
18天前
|
监控 算法 Java
Java虚拟机(JVM)的垃圾回收机制深度解析####
本文深入探讨了Java虚拟机(JVM)的垃圾回收机制,旨在揭示其背后的工作原理与优化策略。我们将从垃圾回收的基本概念入手,逐步剖析标记-清除、复制算法、标记-整理等主流垃圾回收算法的原理与实现细节。通过对比不同算法的优缺点及适用场景,为开发者提供优化Java应用性能与内存管理的实践指南。 ####
|
11天前
|
Java 编译器
Java 泛型详细解析
本文将带你详细解析 Java 泛型,了解泛型的原理、常见的使用方法以及泛型的局限性,让你对泛型有更深入的了解。
24 2
Java 泛型详细解析
|
12天前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
40 12
|
9天前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
9天前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
11天前
|
Java 数据库连接 开发者
Java中的异常处理机制:深入解析与最佳实践####
本文旨在为Java开发者提供一份关于异常处理机制的全面指南,从基础概念到高级技巧,涵盖try-catch结构、自定义异常、异常链分析以及最佳实践策略。不同于传统的摘要概述,本文将以一个实际项目案例为线索,逐步揭示如何高效地管理运行时错误,提升代码的健壮性和可维护性。通过对比常见误区与优化方案,读者将获得编写更加健壮Java应用程序的实用知识。 --- ####
|
15天前
|
数据采集 存储 Web App开发
Java爬虫:深入解析商品详情的利器
在数字化时代,信息处理能力成为企业竞争的关键。本文探讨如何利用Java编写高效、准确的商品详情爬虫,涵盖爬虫技术概述、Java爬虫优势、开发步骤、法律法规遵守及数据处理分析等内容,助力电商领域市场趋势把握与决策支持。
|
18天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
39 8
|
15天前
|
安全 Java
Java中WAIT和NOTIFY方法调用时机的深层解析
在Java多线程编程中,`wait()`和`notify()`方法的正确使用对于线程间的协调至关重要。这两个方法必须在同步块或同步方法中调用,这一规定的深层原因是什么呢?本文将深入探讨这一机制。
27 5