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

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

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

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

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

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

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

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

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

 View.OnClickListener count = new View.OnClickListener() {
@Override
public void onClick(View v) {
//m1、n1用于直接由Sring 转为 int 判断输入的合法性,不作运算
int m1,n1;
//BigDecimal有很多个初始化方法,我这里列举一个,在初始化类对象的同时,传入数字字符串,此时的对象值为该数字
//下面的 m、n 都是 1 ,因为我的这个监听事件的运算是从 1 开始的。 BigDecimal m = new BigDecimal("");
BigDecimal n = new BigDecimal(""); BigDecimal result_2 = new BigDecimal("");//这个用来保存 m!/(m-n)!n! 中的 m-n 阶乘 从1开始
Toast.makeText(MyActivity.this,save_m+"***"+save_switch+"///"+save_n,Toast.LENGTH_LONG).show(); m1 = Integer.parseInt(save_m);//save_m 和 下面的 save_n 都是 editText 输入获取的值
n1 = Integer.parseInt(save_n);
if(m1< || n1< || m1 < n1){
t3.setText("保持 m>=0,n>=0,且 m >n,组合计算请保持 m<900,n<900");
}else {
//太大,运算速度有延迟,几千亿的数运算,计算机都要几个秒
if(save_switch.equals("组合") || n1> || m1>) {
t3.setText("组合计算请保持 m<900,n<900");
}else {
if (save_switch.equals("组合")) {
//long result_1 = 1, result_2 = 1, result = 1;//long 都不够用
for (int i = ; i <= m1; i++) {
Log.d("tag", "before * m is " + m + ":" + "i is " + i); //BigDecimal 类方法,乘法,这里的乘包括同门的加、减、除,不再是+、-、*、/
//常用乘法: multiply(BigDecimal xx),四个都有返回值,返回类型也是 BigDecimal
//下面这行是个例子
m = m.multiply(BigDecimal.valueOf(i));//每次乘 i
// 我上面的 BigDecimal.valueOf(i) 这个是用于把 int 类型的 i转为 BigDecimal 对象传入 if (i <= n1) {
Log.d("tag", "before * n is " + n + ":" + "i is " + i);
n = n.multiply(BigDecimal.valueOf(i));
}
if (i <= (m1 - n1)) {
Log.d("tag", "before * result_2 is " + result_2 + ":" + "i is " + i);
result_2 = result_2.multiply(BigDecimal.valueOf(i));
}
Log.d("tag", "-" + result_2);
}
Log.d("tag", "m->" + m);
Log.d("tag", "n->" + n);
Log.d("tag", "r->" + result_2);
// 除法: divide(),用法参照上面的乘法
m = m.divide(n.multiply(result_2));
t3.setText("Result is:" + m + ";");
}
}
if(save_switch.equals("排列")){
Toast.makeText(MyActivity.this,"",Toast.LENGTH_LONG).show();
//int result_1 = 1, result_2 = 1, result = 1;
for (int i = ; i <= m1; i++) {
// Log.d("tag","is->"+result);
m = m.multiply(BigDecimal.valueOf(i));
Log.d("tag","i->"+i);
if (i <= (m1 - n1)) {
result_2 = result_2.multiply(BigDecimal.valueOf(i));
}
}
//t3.setText("For double is:" + result + ";" + "For FenShu is:" + result_2);
m = m.divide(result_2);
t3.setText("Result is:" + m + ";");
}
}
}
};

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

java 大数据处理类 BigDecimal 解析的更多相关文章

  1. Java 8 Optional 类深度解析

    Java 8 Optional 类深度解析 身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只 ...

  2. Java基础常用类深度解析(包含常见排序算法)

    目录 一.工具类 1.1.工具类的设计 1.1.1.公共静态方法 1.2.单例模式 二.包装类 2.1.基本类型的包装类 2.1.1.Integer 2.1.1.1.Integer >> ...

  3. java 大数据处理之内存溢出解决办法(一)

    http://my.oschina.net/songhongxu/blog/209951 一.内存溢出类型 1.java.lang.OutOfMemoryError: PermGen space JV ...

  4. Java 8 Optional类深度解析

    身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数. ...

  5. Java 8 Optional类深度解析(转)

    经常会遇到这样的问题,调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数. 新版本的Java,比如J ...

  6. Java 8 Optional类深度解析(转载)

    身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数. ...

  7. [转]Java 8 Optional类深度解析(null处理)

    原文链接:http://www.importnew.com/6675.html 本文由 ImportNew - 高俊阳 翻译自 javacodegeeks.欢迎加入翻译小组.转载请见文末要求. 身为一 ...

  8. java笔记--String类对象解析与运用

    --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3877236.html "谢谢-- 1.String中的equals和==的 ...

  9. Java集合---Array类源码解析

    Java集合---Array类源码解析              ---转自:牛奶.不加糖 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Prim ...

随机推荐

  1. javascript 创建对象的7种模式

    使用字面量方式创建一个 student 对象: var student = function (){ name : "redjoy", age : 21, sex: women, ...

  2. 关于i和j

    算法课无聊随手写了段c代码,发现了个问题,就要下课了,先记一下 for(int i = 0; i < 100; i ++) for(int j = 0; j < 100000; j ++) ...

  3. 最小生成树 prime poj1258

    题意:给你一个矩阵M[i][j]表示i到j的距离 求最小生成树 思路:裸最小生成树 prime就可以了 最小生成树专题 AC代码: #include "iostream" #inc ...

  4. Python3.5+selenium操作Chrome浏览器

    1.安装selenium 命令提示符下输入: pip install selenium 2.下载chromedriver 点击下载 3.将解压后的chromedriver.exe放到chrome浏览器 ...

  5. 丰富“WinForms” 的一个别样"项目"(学生管理)

    一个别样的WinForms项目,他并没多么的新颖,但是它的用处确实有点多,或许会有你需要的地方:如果你对WinForms中那么多控件无法把握,又或者是你根本就不懂,那我觉得你应该好好看看,如果一个人的 ...

  6. ZXing二维码生成在Unity3D中出错,数组超出界限的解决办法

    错误截图: IndexOutOfRangeException: Array index is out of range.ZXing.Color32Renderer.Render (ZXing.Comm ...

  7. Sage Crm 权限原理分析

    文字是11年写的,贴出来共享一下,先来一张表结构图: 一.区域.表名:[territories] 1.我们先来看看区域表的结构. 从图中前面都是不能为空的字段,都是很重要的.来介绍一下这些字段: Te ...

  8. C#_技巧:计算代码块运行的时间

    System.Diagnostics下类Stopwatch,给程序代码块运行计时, 利用start()和stop()方法来标记代码快. 该命名空间下还有一些其他类,可以对程序进行诊断(diagnosi ...

  9. Javascript基础回顾 之(三) 面向对象

    本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...

  10. Nova PhoneGap框架 第六章 使用Mock

    在我们的框架中引入了一个很重要的设计,那就是使用Mock. 这里的mock是指cordova.mock.js文件,它模拟了PhoneGap(Cordova)的API,从而可以在浏览器中运行测试我们的程 ...