因为项目使用到 BigDecimal.ROUND_DOWN 接近零的舍入模式 ,没想到有一个 使用的坑。 下面来例子说明:

String add = "67.80";

System.out.println(add.toString());

BigDecimal t = new BigDecimal(Double.valueOf(add));

System.out.println(t.toString());// 67.7999999999999971578290569595992565155029296875

System.out.println(t.setScale(2, BigDecimal.ROUND_DOWN));// 67.79

System.out.println(t.setScale(2, BigDecimal.ROUND_HALF_UP));// 67.80

可以看到 , 如果 BigDecimal 是由 double 来构造的,那么 使用 ROUND_DOWN 的时候,有时候会 发现 比实际的 值会小一点, 这就坑大了。 除非 是 值的小数点要比 直接 的小数位 多一些。 比如 String add = "67.802"; 这样的, 就可以。

如果是 使用 String 类型的就没有这样的问题。

String add = "67.80";

System.out.println(add);

BigDecimal t = new BigDecimal(add);

System.out.println(t.toString());// 67.80

System.out.println(t.setScale(2, BigDecimal.ROUND_DOWN));// 67.79

System.out.println(t.setScale(2, BigDecimal.ROUND_HALF_UP));// 67.80

如果要避免的话 double , 可以使用 Double.toString() 方法来构造 BigDecimal

String add = "67.80";

System.out.println(add.toString());

BigDecimal t = new BigDecimal(Double.toString(new Double(add)));

System.out.println(t.toString());// 67.80

System.out.println(t.setScale(2, BigDecimal.ROUND_DOWN));// 67.80

总结

BigDecimal 的问题的,避免不了,只能说 使用其他方式了,记在心上。 因此 构造 BigDecimal 尽量不要使用 double 了。

java bigdecimal.round_down,java BigDecimal 的 setScale() 方法的 BigDecimal.ROUND_DOWN 舍入模式的BUG,坑...相关推荐

  1. 全网最全的BigDecimal的newScale(保留小数位)和roundingMode(舍入模式),详细介绍roundingMode(重点)

    一般我们要对一个BigDecimal的数字进行保留小数位和设置舍入模式的时候,都是这样使用的: 对于加.减.乘得到的数字,直接使用BigDecimal对象.setScale,就像这样: 或者除法,在做 ...

  2. Java复习五:抽象类+模板设计方法+接口+三种工厂模式

    抽象类 类的设计应该保证父类和子类能够共享特征.有时将一个父类设计的非常抽象,以至于它没有具体的实例,这样的类叫做抽象类 abstract可以修饰类.抽象类 ​ 抽象类不可以实例化 ​ 抽象类中一定有 ...

  3. java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定

    java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定 2016年05月11日 11:20:08 阅读数:6336 一. 计算机的小数计算一定范围内精确,超过范围只能 ...

  4. BigDecimal类 setScale()方法java.lang.ArithmeticException: Rounding necessary

    BigDecimal调用setScale方法时,当未设置舍入模式时,系统会给个默认ROUND_UNNECESSARY(int 值为7)值,如果小数点后不为零,而且要保留的小数位数小于旧小数位数,那么此 ...

  5. 【java笔记】java中用于小数进位的BigDecimal.setScale方法

    BigDecimal.setScale主要用于对BigDecimal数据小数点后的位数进行进位.舍位.截断等操作.其进位方式主要有以下8种,依次分别对应着数字0~7,即写它们和写它们对应的数字是等价的 ...

  6. setscale方法的用法_【java】BigDecimal.setScale用法总结

    ====================写法======================== 1. BigDecimal num1 = new BigDecimal(2.225667);//这种写法不 ...

  7. Java注解方法实现BigDecimal保留两位小数(案例详解)

    [辰兮要努力]:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端.后台.数据 ...

  8. java中的BigDecimal与String的相互转换以及compareTo()方法的使用

    文章目录 1:String类型转BigDecimal类型 2:BigDecimal类型转String类型 3:比较两个BigDecimal值:是否还是使用equals? compareTo()方法 拓 ...

  9. java 向上舍入_介绍Java的大数类(BigDecimal)和八种舍入模式

    1.BigDecimal简介 BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成.如果为零或正数,则标度是小数点后的位数.如果为负数,则将该数的非标度值乘以 1 ...

最新文章

  1. kset_register
  2. DarkTrack 4 Alien Version Released RAT 下载地址视频教程
  3. WordPress快速打造个人博客
  4. Vue之$nextTick属性
  5. Linux内核权限维持,Linux权限维持笔记
  6. SpringFramework核心技术一(IOC:命名bean)
  7. SQL-UNION操作符
  8. 苹果蓝牙协议的源代码质量都这么差了吗?!研究员找到10个 0day
  9. mysql 总分区表限制_MySQL分区表的局限和限制详解
  10. 【C语言】流程图符号及流程图
  11. 搭建 WordPress 博客教程
  12. Bagging和Boosting 策略及其区别
  13. 【MySQL】格式化时间戳以及时间格式
  14. 单词记忆分类系统化--000
  15. 前端体系结构知识概括
  16. 大型企业中业务中台建设思考
  17. ADI Blackfin DSP处理器-BF533的开发详解20:4.3寸LCD液晶屏的设计与应用(含源码)
  18. QT 触摸屏下滑滚动
  19. 主机与虚拟机之间的通信(ping命令)
  20. carlife android 无线,carlife可以无线连接吗

热门文章

  1. 交互式数据可视化_我如何构建一个交互式仪表板Web应用程序以可视化拳击数据...
  2. 前度字符串转数组_关于前度书籍的阿里云论坛用户知识和技术交流
  3. 开启binary log功能
  4. java log4j详解_log4j详解
  5. 《亚马逊云科技-游戏孵化营》第一次公开课学习心得
  6. 2021年国庆节假期三亚游客离岛免税购物热情高涨、偏爱高端酒店与景点新玩法...
  7. css3缓慢出现,让CSS3旋转开始缓慢然后结束缓慢?
  8. 百度数据可视化Sugar BI — 表计算
  9. 阿西莫夫定律:自动驾驶汽车算不算机器人?该不该伤人?
  10. python数据结构与算法 20 递归和递归三定律