java bigdecimal.round_down,java BigDecimal 的 setScale() 方法的 BigDecimal.ROUND_DOWN 舍入模式的BUG,坑...
因为项目使用到 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,坑...相关推荐
- 全网最全的BigDecimal的newScale(保留小数位)和roundingMode(舍入模式),详细介绍roundingMode(重点)
一般我们要对一个BigDecimal的数字进行保留小数位和设置舍入模式的时候,都是这样使用的: 对于加.减.乘得到的数字,直接使用BigDecimal对象.setScale,就像这样: 或者除法,在做 ...
- Java复习五:抽象类+模板设计方法+接口+三种工厂模式
抽象类 类的设计应该保证父类和子类能够共享特征.有时将一个父类设计的非常抽象,以至于它没有具体的实例,这样的类叫做抽象类 abstract可以修饰类.抽象类 抽象类不可以实例化 抽象类中一定有 ...
- java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定
java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定 2016年05月11日 11:20:08 阅读数:6336 一. 计算机的小数计算一定范围内精确,超过范围只能 ...
- BigDecimal类 setScale()方法java.lang.ArithmeticException: Rounding necessary
BigDecimal调用setScale方法时,当未设置舍入模式时,系统会给个默认ROUND_UNNECESSARY(int 值为7)值,如果小数点后不为零,而且要保留的小数位数小于旧小数位数,那么此 ...
- 【java笔记】java中用于小数进位的BigDecimal.setScale方法
BigDecimal.setScale主要用于对BigDecimal数据小数点后的位数进行进位.舍位.截断等操作.其进位方式主要有以下8种,依次分别对应着数字0~7,即写它们和写它们对应的数字是等价的 ...
- setscale方法的用法_【java】BigDecimal.setScale用法总结
====================写法======================== 1. BigDecimal num1 = new BigDecimal(2.225667);//这种写法不 ...
- Java注解方法实现BigDecimal保留两位小数(案例详解)
[辰兮要努力]:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端.后台.数据 ...
- java中的BigDecimal与String的相互转换以及compareTo()方法的使用
文章目录 1:String类型转BigDecimal类型 2:BigDecimal类型转String类型 3:比较两个BigDecimal值:是否还是使用equals? compareTo()方法 拓 ...
- java 向上舍入_介绍Java的大数类(BigDecimal)和八种舍入模式
1.BigDecimal简介 BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成.如果为零或正数,则标度是小数点后的位数.如果为负数,则将该数的非标度值乘以 1 ...
最新文章
- kset_register
- DarkTrack 4 Alien Version Released RAT 下载地址视频教程
- WordPress快速打造个人博客
- Vue之$nextTick属性
- Linux内核权限维持,Linux权限维持笔记
- SpringFramework核心技术一(IOC:命名bean)
- SQL-UNION操作符
- 苹果蓝牙协议的源代码质量都这么差了吗?!研究员找到10个 0day
- mysql 总分区表限制_MySQL分区表的局限和限制详解
- 【C语言】流程图符号及流程图
- 搭建 WordPress 博客教程
- Bagging和Boosting 策略及其区别
- 【MySQL】格式化时间戳以及时间格式
- 单词记忆分类系统化--000
- 前端体系结构知识概括
- 大型企业中业务中台建设思考
- ADI Blackfin DSP处理器-BF533的开发详解20:4.3寸LCD液晶屏的设计与应用(含源码)
- QT 触摸屏下滑滚动
- 主机与虚拟机之间的通信(ping命令)
- carlife android 无线,carlife可以无线连接吗
热门文章
- 交互式数据可视化_我如何构建一个交互式仪表板Web应用程序以可视化拳击数据...
- 前度字符串转数组_关于前度书籍的阿里云论坛用户知识和技术交流
- 开启binary log功能
- java log4j详解_log4j详解
- 《亚马逊云科技-游戏孵化营》第一次公开课学习心得
- 2021年国庆节假期三亚游客离岛免税购物热情高涨、偏爱高端酒店与景点新玩法...
- css3缓慢出现,让CSS3旋转开始缓慢然后结束缓慢?
- 百度数据可视化Sugar BI — 表计算
- 阿西莫夫定律:自动驾驶汽车算不算机器人?该不该伤人?
- python数据结构与算法 20 递归和递归三定律