在多功能计算器项目中,计算器和单位换算功能都要求要有20位的精确度,并且要支持超大数,因此double类型就完全不够看了(double类型最多支持16位有效数字,且最大值只支持10^308次方),最后确定使用BigDecimal承载数据进行运算。下面我就列出一些BigDecimal的一些常用用法及注意点:

BigDecimal的常用方法:

加:add(BigDecima)

减:subtract(BigDecimal)

乘:multiply(BigDecimal)

除:divide(BigDecimal)

乘方:pow(int)

取绝对值:abs()

取反:negate()

对比:compareTo(BigDecimal)

设置小数点精确度:setScale(int)

设置保留小数点精确度并添加保留方式(直接加1或者四舍五入):setScale(int, int)
 BigDecimal支持任意精度,任意长度的浮点数运算,但在运算的时候最好设置各个操作数的小数精确度,特别是除法。结果需要保留几位小数,如果没有设置除法的操作数的小数精确度,计算结果的精确度就会和操作数中最低精确度一致,导致计算结果不正确,如下例子:

            String a = "1";
String b = "4.56";
BigDecimal aBD = new BigDecimal(a);
BigDecimal bBD = new BigDecimal(b);
BigDecimal resultBD = aBD.divide(bBD).setScale(3,
java.math.BigDecimal.ROUND_HALF_UP);

3是保留小数,ROUND_HALF_UP是四舍五入,此参数的其他值请查看文章:

http://www.bdqn.cn/news/201311/11834.shtml

这个例子你期望的是0.219,但是你实际会得到0。为什么呢?这就是保留精确度问题了,a是一个整数,运算时把结果当作整数取了,那就是0了。所以,应该按下面的运算:

            String a = "1";
String b = "4.56";
BigDecimal aBD = new BigDecimal(a).setScale(3);
BigDecimal bBD = new BigDecimal(b).setScale(3);
BigDecimal resultBD = aBD.divide(bBD).setScale(3,
java.math.BigDecimal.ROUND_HALF_UP);

这样,你就会得到一个正确的值了。

还有一个需要注意的点,计算结果,如例子中的resultBD一定要设置其setScale的第二个参数,不然会报错。如果计算结果没有按某个方式进行截断,那么机器就不知道如何去取这个结果了,因此报错。

BigDecimal的结果格式化:

将BigDecimal计算的结果toString()输出,不是按科学计数法的格式的,如果想改成这种格式,可以使用DecimalFormat进行转换,具体如下:

 

BigDecimal的一些用法的更多相关文章

  1. BigDecimal最基础用法

    BigDecimal最基础用法 用字符串生成的BigDecimal是不会丢精度的. 简单除法. public class DemoBigDecimal { public static void mai ...

  2. BigDecimal最基础用法【转】

    BigDecimal最基础用法 用字符串生成的BigDecimal是不会丢精度的. 简单除法. public class DemoBigDecimal { public static void mai ...

  3. BigInteger和BigDecimal的基本用法

    整型大数 BigInteger: import java.math.BigInteger; import java.util.Scanner; public class Main { public s ...

  4. java中BigDecimal加减乘除基本用法

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数. 在实际应用中,需要对更大或者更小的数进 ...

  5. BigDecimal类的用法

    (一)BigDecimal类的常用的几个构造方法 BigDecimal(int):将int表示形式转换为BigDecimal对象 BigDecimal(String):将字符串表示形式转换为BigDe ...

  6. BigDecimal 使用方法详解

    BigDecimal 使用方法详解 博客分类: java基础 bigdecimalmultiplyadddivide  BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (sca ...

  7. BIgInteger类和BigDecimal类的理解

    第一部分: 这两个类位于java.math包内,要使用它们必须在类前面引用该包:import java.math.BigInteger;和import java.math.BigDecimal; Bi ...

  8. (转)使用BigDecimal进行精确运算

    场景:在进行支付业务的金额计算时,通常采用BigDecimal类型的数据,并没有看到常见的int double类型,所以有必要好好学习下BigDecimal的常用用法. 1 误区 首先我们先来看如下代 ...

  9. Java开发笔记(三十)大小数BigDecimal

    前面介绍的BigInteger只能表达任意整数,但不能表达小数,要想表达任意小数,还需专门的大小数类型BigDecimal.如果说设计BigInteger的目的是替代int和long类型,那么设计Bi ...

随机推荐

  1. Java逻辑

    1.开发简单Java应用程序 1-1:什么是程序 程序:为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合.1-2:为什么学习Java Java是现在的主流1-3:Java可以做什么 ...

  2. 一篇文章有若干行,以空行作为输入结束的条件。统计一篇文章中单词the(不管大小写,单词the是由空格隔开的)的个数。

    #include <iostream>using namespace std; int k = 0;int n = 0;int main() { char c; char a[1000]; ...

  3. MFC消息-自定义消息

    转:http://blog.csdn.net/penpenandtongtong/article/details/18598907 像MFC的窗口发送消息,可以进行自定义的动作行为,因此很多时候非常有 ...

  4. Unity中Button按钮的触发监听事件

    第一种方式:需要把自己添加的Button按钮属性(Inspector)中的(Button)onclick添加方法. public void BtnCreteClick() { Debug.Log(&q ...

  5. 升级pip10.0.0后出现ModuleNotFoundError: No module named 'pip'的问题

    pip10升级后各种pip install出错----- Traceback (most recent call last): File "/usr/local/bin/pip", ...

  6. Cracking The Coding Interview 1.3

    //原文: // // Design an algorithm and write code to remove the duplicate characters in a string withou ...

  7. Codeforces Round #495 (Div. 2) B

    题目链接:http://codeforces.com/contest/1004/problem/B B. Sonya and Exhibition time limit per test 1 seco ...

  8. L264 how cats are psychopaths

    When Becky Evans started studying cat-human relationships, she kept hearing, over and over again, ab ...

  9. L256 阅读理解

    1主旨题 2细节题 题干关键词 人名,地名,专有名词,时间,和主题相关的核心词汇,带特殊标点的词汇 干扰项 词意猜测

  10. Python 基础关于编码

    一.编码的种类: 1 acsic码   基本不用    不同编码之间互用会产生乱码, 2unicode    A 字母  4个字节   00000000 00000000 00100100 01000 ...