在项目中使用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. TensorFlow:检查显卡支持哪个版本的CUDA

    最近想学习TensorFlow深度学习编程,然后就开始查这方面的信息. 第0步是安装环境,配置环境. 首先到TensorFlow的官网查看在Windows上安装的条件和步骤. 可以仅仅安装CPU版本的 ...

  2. sqlserver2008简介

    sql 数据库简介 应该掌握的部分: 1.  数据库的基本概念 2.  数据库模型的基本概念 3.  实体联系模型的基本概念 4.  关系模型的基本概念和性质 5.  数据库优化理论 6.  掌握创建 ...

  3. 转载一篇阿里云Terraform 开发指南

    连接:https://www.jianshu.com/p/0aebea117cae 是一个比较详细的开发指南          

  4. SSM学习笔记

    Spring MVC[入门]就这一篇! https://www.jianshu.com/p/91a2d0a1e45a SpringMVC非注解方式和注解方式不能同时使用.注解方式只需要配一句话就行了d ...

  5. Java ConcurrentHashMap存入引用对象时也是线程安全的

    本人小白,看到资料说ConcurrentHashMap是线程安全的,get过程不需要加锁,put是线程安全的,推荐高并发时使用.但是本人不清楚是否该map中存入的引用类型对象,对象属性变化也是否线程安 ...

  6. docker--私有仓库

    私有仓库 有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用. 本节介绍如何使用本地仓库. docker-registry 是官方提供的工具,可以用于构建私 ...

  7. 开发者必备的 12 个 JavaScript 库

    现在 web 设计是最有趣的了,做好 web 设计不仅要熟练使用 Javascript,css 和 html 等,还要有自己的创意设计.为了方便大家发挥自己的创意,就产生了很多 JS 框架,Node. ...

  8. eclipse项目上传服务器注意事项

    1.先准备服务器环境 2 数据库导入,tomcat安装 3 开放服务器端口,配置网络 4.修改本地代码修改为发布版本,即ip,账号密码数据库等 5 变动的信息应该写在配置文件或者一个全局产量中,这样才 ...

  9. javaweb开发大致流程

  10. C3D视频特征提取

    一.部署 1. 先把项目Clone下来 git clone https://github.com/jfzhang95/pytorch-video-recognition.git 2. 安装环境: Py ...