在项目中使用BigDecimal计算将单位从B换成TB时,算出来的结果总是整数,而没有保留设置的2位小数;

计算代码如下:

db.divide(oneTB, ROUND_HALF_UP).setScale(2,ROUND_HALF_UP).doubleValue();  

代码中指定了保留小数是2位,然后四舍五入,但是最后的结果总是整数,于是手动执行了下前面的divide部分,发现从divide的执行结果出来就是整数了,整数保留2位还是整数,小数当然没有了,

查看divide函数源码,代码如下:

public BigDecimal divide(BigDecimal divisor, int roundingMode) {
return this.divide(divisor, scale, roundingMode);
}  

代码中,执行divide函数时,默认给了一个本身的scale,这个scale的值是一开始你生成BigDecimal时赋的值,但是代码中我并没有专门在一开始赋值,

定义变量代码如下:

BigDecimal db = new BigDecimal(b);
BigDecimal oneTB = new BigDecimal(1099511627776.0D);  

代码中可以知道,一开始并没有给db赋scale的变量值,于是查看了下构造函数,

发现有这么一块代码:

public BigDecimal(long val) {
this.intCompact = val;
this.intVal = (val == INFLATED) ? INFLATED_BIGINT : null;
this.scale = 0;
} 

原因找到了,我初始化的变量b是long型的,构造函数在你使用long型值初始化时,会默认将scale的值设置成0,如果你后续不专门指定scale的值的话,就相当于计算结果默认取整。

因为我后续计算时没有指定scale的值,所以结果都是整数,在计算结果是整数的情况下,再设置保留2位也仍然会是整数,这就是结果保留位数不对的原因。

Java使用BigDecimal计算保留位数不对问题定位的更多相关文章

  1. BigDecimal的保留位数和四舍五入的方法

    一 BigDecimal num = new BigDecimal("2.225667");//一般都会这样写最好 int count = num.scale(); System. ...

  2. java 用BigDecimal计算商品单价乘以折扣价

    商品单价价格是单位是(分),用户下单金额=商品单价*折扣  代码如下 Integer discount = 5 折扣五折 Integer orderPrice = 1000  单位分 BigDecim ...

  3. java.math.BigDecimal保留两位小数,保留小数,精确位数

    http://blog.csdn.net/yuhua3272004/article/details/3075436 使用java.math.BigDecimal工具类实现   java保留两位小数问题 ...

  4. Java使用BigDecimal保留double、float运算精度、保留指定位数有效数字、四舍五入

    工具类 package --; import java.math.BigDecimal; /** * Created by kongqw on 2015/12/10. */ public final ...

  5. JAVA中精确计算金额BigDecimal

    package com.chauvet.utils; import java.math.BigDecimal; import java.text.DecimalFormat; import java. ...

  6. 商业计算中Java高精度计算BigDecimal类

    <Effective Java> 第48条:如果需要精确的答案,请避免使用float和double. 如果我们编译运行下面这个程序会看到什么?public class Test{    p ...

  7. JAVA大数类—基础操作(加减乘除、取模、四舍五入、设置保留位数)

    当基础数据类型长度无法满足需求时可以使用大数类 构造方法接受字符串为参数 BigInteger bInt = new BigInteger("123123"); BigDecima ...

  8. java四舍五入BigDecimal和js保留小数点两位

    java四舍五入BigDecimal保留两位小数的实现方法: // 四舍五入保留两位小数System.out.println("四舍五入取整:(3.856)="      + ne ...

  9. Java使用BigDecimal解决精确计算的问题

    最近有人在微信上给我发了一个数学题目,如下图: 我看了之后感觉很是简单,但是却想了半天才解出来.解出来后我想到了用程序再解一遍,然而精确计算的问题却让人头疼不已. 解题思路: 思路其实很简单,暴力求解 ...

随机推荐

  1. [硬件]_ELVE_STLINK下载出现nternal command error问题

    我之前也出现过这个这个,然后折腾一晚上,升级什么都都不好使 最后我换了一根短的线,回归正常!!!

  2. PyCharm导入tensorflow包

    若是你也遇到这个问题,说明你也没有理解tensorflow到底在哪里. 当安装了anaconda3.6后,在PyCharm中设置interpreter,这个解释器决定了你在PyCharm环境中写的代码 ...

  3. 使用bind提供域名解析服务

  4. CentOS6/7快捷使用gcc5

    Centos6/7自带的gcc为4.x版本,可通过devtoolset工具集安装gcc5.x版本 1. 添加yum源 1)CentOS6 [hhorak-devtoolset--rebuild-boo ...

  5. pymongo中的连接操作:Connection()与MongoClient()

    class MongoClient(pymongo.common.BaseObject) Connection to MongoDB. Method resolution order: MongoCl ...

  6. Python map,filter,reduce函数

    # -*- coding:utf-8 -*- #定义一个自己的map函数list_list = [1,2,4,8,16] def my_map(func,iterable): my_list = [] ...

  7. golang-http-post

    func httpPost() { resp, err := http.Post("https://www.abcd123.top/api/v1/login", "app ...

  8. ansible常用模块入门

    常用模块有以下几个 command copy shell crond yum service setup 1.command模块 ansible george -m command -a " ...

  9. js设置,获取cookie

    function setCookie(c_name,value,expireMinutes){ var exdate=new Date(); exdate.setMinutes(exdate.getM ...

  10. docker-compose up使用自定义的网段的两种方式(从其根源指定)

    问题描述         还是那个研究安全大业的同事,在部署他的秘密武器,是用docker-compose部署的,有差不多20多个docker-compose.yml文件,然后由于docker-com ...