博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 大数值
阅读量:4049 次
发布时间:2019-05-25

本文共 2004 字,大约阅读时间需要 6 分钟。

-- Start

如果你觉得 long 和 double 不能满足你的要求, Java还提供了两个表示大数值的类 BigInteger BigDecimal. 它们提供了任意精度, 要想对它们进行数学运算, 需要调用它们提供的方法而不是运算符, 加减乘除分别是add, subtract, divide 和 multiply方法.

BigInteger 的使用比较简单, 实在没什么好说的, 所以我就不费口舌了.

BigDecimal 是由 BigInteger 和 标度(scale)  构成的, 标度决定了小数点的位置。所以,我们可以通过以下方式来构造1.234

BigDecimal b1 = new BigDecimal(new BigInteger("1234"), 3);

对于 BigDecimal 之间的 加, 减和乘 运算来说, 我们可以不用考虑标度, 毕竟无论怎么计算, 计算结果的小数位数是有限的. 但是除法就不同了, 想想一下 1/3 是什么结果呢? 试着运行一下下面的代码吧.

BigDecimal b1 = new BigDecimal("1.0");BigDecimal b2 = new BigDecimal("3.0");System.out.println(b1.divide(b2));

以上代码会抛出 ArithmeticException 异常,如果你想保留两位小数的话,应该这样写。

BigDecimal b1 = new BigDecimal("1.0");BigDecimal b2 = new BigDecimal("3.0");System.out.println(b1.divide(b2, 2, RoundingMode.HALF_UP));

要想对 BigDecimal 进行运算, 以下两个概念你必须清楚.

精度(precision) 指的是所有数字的位数.

四舍五入的方式(Rounding Mode)相对好理解, BigDecimal 支持如下四舍五入方式.

数字 UP DOWN CEILING FLOOR HALF_UP HALF_DOWN HALF_EVEN
5.5 6 5 6 5 6 5 6
2.5 3 2 3 2 3 2 2
1.6 2 1 2 1 2 2 2
1.1 2 1 2 1 1 1 1
1 1 1 1 1 1 1 1
-1 -1 -1 -1 -1 -1 -1 -1
-1.1 -2 -1 -1 -2 -1 -1 -1
-1.6 -2 -1 -1 -2 -2 -2 -2
-2.5 -3 -2 -2 -3 -3 -2 -2
-5.5 -6 -5 -5 -6 -6 -5 -6
Java 用 MathContext 类来封装以上这两个概念,来看下面的例子。

public static void main(String[] args) throws Exception {    BigDecimal b1 = new BigDecimal(new BigInteger("1234"), 3); // 1.234     BigDecimal b2 = new BigDecimal(new BigInteger("10"), 1); // 1.0        BigDecimal add = b1.add(b2).setScale(2, RoundingMode.HALF_UP); // 保留2位小数    System.out.println("1.234 + 1.0 = " + add);        BigDecimal subtract = b1.subtract(b2).setScale(2, RoundingMode.HALF_UP); // 保留2位小数    System.out.println("1.234 - 1.0 = " + subtract);        BigDecimal multiply = b1.multiply(b2).setScale(2, RoundingMode.HALF_UP); // 保留2位小数    System.out.println("1.234 * 1.0 = " + multiply);        BigDecimal divide = b1.divide(b2, 2, RoundingMode.HALF_UP); // 保留2位小数    System.out.println("1.234 / 1.0 = " + divide);

---
更多参见:
--
声 明:转载请注明出处
-- Last Updated on 2012-05-04
-- Written by ShangBo on 2012-04-27
-- End
你可能感兴趣的文章
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>
vsftp 配置具有匿名登录也有系统用户登录,系统用户有管理权限,匿名只有下载权限。
查看>>
linux安装usb wifi接收器
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
让我做你的下一行Code
查看>>
浅析:setsockopt()改善程序的健壮性
查看>>
关于对象赋值及返回临时对象过程中的构造与析构
查看>>
VS 2005 CRT函数的安全性增强版本
查看>>
Visual Studio 2010:C++0x新特性
查看>>
drwtsn32.exe和adplus.vbs进行dump文件抓取
查看>>
cppcheck c++静态代码检查
查看>>
在C++中使用Lua
查看>>
一些socket的编程经验
查看>>
socket编程中select的使用
查看>>
可以在线C++编译的工具站点
查看>>
关于无人驾驶的过去、现在以及未来,看这篇文章就够了!
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
为什么读了很多书,却学不到什么东西?
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>