关于BigDecimal的ROUND_HALF_EVEN

chenwei3390 2009-12-03 08:08:25
BigDecimal的ROUND_HALF_EVEN按照工程学的行话来讲就是“四舍六入,逢五奇进偶舍”
对于整数时,该属性完全合适,对于小数就完全不对了。
下面是小弟的测试程序,以及测试数据,望高手不吝赐教
double d=x;
BigDecimal bd = new BigDecimal(d);
System.out.println(bd.doubleValue());
BigDecimal bd1 = bd.setScale(2, BigDecimal.ROUND_HALF_EVEN);
System.out.println(bd1.doubleValue());



0.5
0.0
1.5
2.0
2.5
2.0
3.5
4.0




1.115
1.11
1.125
1.12
1.135
1.14
1.145
1.15
1.155
1.16



34.115
34.12
34.125
34.12
34.135
34.13
34.145
34.15
34.155
34.16



39.515
39.52
39.525
39.52
39.535
39.53
39.545
39.55
39.555
39.55


...全文
1681 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenwei3390 2010-01-21
  • 打赏
  • 举报
回复
自己发的帖子,好久都忘了,谢谢crazylaa的解答
我最后是把小数转换成整数再求值的,然后再转为小数
贴代码结贴
public static double RoundEven(double d,int n){
double t=Math.pow(10,n);
d=d*t;//将需要计算的精度转化为整数
BigDecimal bd = new BigDecimal(d);
//奇进偶舍方法只对整数有效
BigDecimal bd1 = bd.setScale(0, BigDecimal.ROUND_HALF_EVEN);
return bd1.doubleValue()/t;
}
studying_ 2009-12-04
  • 打赏
  • 举报
回复

以后要用BigDecimal.valueOf(double d)了。。。。。
crazylaa 2009-12-03
  • 打赏
  • 举报
回复
果然。。。
double d=39.555;
BigDecimal bd = new BigDecimal(d);

System.out.println(bd.toString());
BigDecimal bd1 = bd.setScale(2, BigDecimal.ROUND_HALF_EVEN);
System.out.println(bd1.doubleValue());

结果:
IWAV0055I Java Bean test.TestA started with the main method
39.55499999999999971578290569595992565155029296875
39.55


以后要用BigDecimal.valueOf(double d)了。。。。。
crazylaa 2009-12-03
  • 打赏
  • 举报
回复
或者用
double d=39.555;
BigDecimal bd = BigDecimal.valueOf(d);
System.out.println(bd.doubleValue());
BigDecimal bd1 = bd.setScale(2, BigDecimal.ROUND_HALF_EVEN);
System.out.println(bd1.doubleValue());

楼主用的 BigDecimal(double d)构造,估计跟这里说的1的0.1的情况有点类似。。。
crazylaa 2009-12-03
  • 打赏
  • 举报
回复
public BigDecimal(double val)

将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。返回的 BigDecimal 的标度是使 (10scale × val) 为整数的最小值。

注:

1. 此构造方法的结果有一定的不可预知性。有人可能认为在 Java 中写入 new BigDecimal(0.1) 所创建的 BigDecimal 正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为 0.1 无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入 到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
2. 另一方面,String 构造方法是完全可预知的:写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好 等于预期的 0.1。因此,比较而言,通常建议优先使用 String 构造方法。
3. 当 double 必须用作 BigDecimal 的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用 Double.toString(double) 方法,然后使用 BigDecimal(String) 构造方法,将 double 转换为 String。要获取该结果,请使用 static valueOf(double) 方法。

经测试,如果采用
BigDecimal bd = new BigDecimal("39.555");
System.out.println(bd.doubleValue());
BigDecimal bd1 = bd.setScale(2, BigDecimal.ROUND_HALF_EVEN);
System.out.println(bd1.doubleValue());
以上数据都对。
ARCH4系统开发指南 1 ARCH4开发小组 1 1 前言 7 1.1 文档编写目的 7 1.2 文档适用范围 7 1.3 修订历史 8 1.4 参考资料 8 2 常用功能处理方式 9 2.1 如何执行条件查询 9 2.1.1 查询示例 9 2.1.2 查询限制 9 2.1.2.1 Like 9 2.1.2.2 In 10 2.1.2.3 Between 10 2.1.2.4 Equal 10 2.1.2.5 NotEqual 10 2.1.2.6 GreaterThan 10 2.1.2.7 GreaterEqual 11 2.1.2.8 LessThan 11 2.1.2.9 LessEqual 11 2.1.2.10 直接Sql限制 11 2.1.2.11 多条件限制 11 2.1.3 查询排序 11 2.2 如何执行HQL查询 11 2.3 如何执行SQL查询 12 2.4 如何使用Mail 12 2.4.1 确保资源文件正确 12 2.4.1.1 确认mail.properties文件设置正确 12 2.4.1.2 确认applicationContext-mail.xml文件设置正确 12 2.4.1.3 确认applicationContext-service.xml文件设置正确 12 2.4.2 编写使用mailService的代码 12 2.5 如何使用规则引擎 14 2.5.1 规则引擎使用说明 14 2.5.2 确保资源文件正确 14 2.5.2.1 确认applicationContext-rule.xml文件设置正确 14 2.5.2.2 确认applicationContext-service.xml文件设置正确 15 2.5.3 规则引擎的使用方式 15 2.6 如何使用代码翻译 16 2.6.1 配置文件 16 2.6.2 在Action中翻译代码 17 2.6.3 在jsp页面中翻译代码 18 2.7 如何使用取单号服务 18 2.7.1 配置文件 19 2.7.2 取单号使用方式 19 2.8 如何使用Hibernate操作Informix数据库 20 2.8.1 实现对LOB数据对象的支持 20 2.8.1.1 配置dataAccessContext-hibernate.xml 20 2.8.1.2 操作CLOB数据 20 2.8.1.3 操作BLOB数据 21 2.8.2 实现Sequence主键生成策略 21 2.9 如何清除Hibernate Session中的对象 22 2.10 使用日期控件 22 2.11 如何引入外部文件 23 2.11.1 主页面采用include方式,引入各个子页面jsp文件 23 2.11.2 主页面用${ctx}方式,引入超链接或资源文件等。 23 2.11.3 主页面用${ctx}方式,引入frame中包含的各个页面。 23 2.12 如何处理代码双击域 24 2.12.1 普通的代码双击域 24 2.12.2 多行输入域中的代码双击域 26 2.12.3 代码双击域的后台处理 27 2.12.4 代码双击域的常见问题 28 2.13 表单提交时调用的JS函数 28 2.13.1 submitFormToSave(form, funcSubmit) 28 2.13.2 submitFormWithoutConfirm(form, funcSubmit) 28 2.13.3 为什么要引入funcSubmit参数 29 2.13.4 为什么要先弹出“Are you sure?”确认信息再判断funcSubmit变量 29 2.14 日期时间和DateTime对象 29 2.15 Service和Dao的关系 31 2.16 如何调用其他Service 31 2.17 校验框架 32 2.17.1 单行校验 32 2.17.2 多行校验 32 2.18 事件处理机制 34 2.18.1 使用Observer模式 34 2.18.2 程序修改方式 34 2.19 用AJAX获取数据(通用做法) 36 2.19.1 “查看条款内容”的操作情景 36 2.19.2 前台JS函数调用后台JAVA类 36 2.19.3 后台JAVA类为前台JS函数返回结果 42 2.19.4 总结 45 2.20 金额的JAVA精确计算 45 2.20.1 double型数据不能进行精确计算 45 2.20.2 四舍五入 46 2.20.3 科学记数法 47 2.20.4 java.math.BigDecimal介绍 48 2.20.4.1 BigDecimal的构造方法 48 2.20.4.2 用BigDecimal进行四则运算 49 2.20.4.3 舍入模式 51 2.20.4.3.1 ROUND_CEILING 51 2.20.4.3.2 ROUND_FLOOR 52 2.20.4.3.3 ROUND_DOWN 53 2.20.4.3.4 ROUND_UP 54 2.20.4.3.5 ROUND_ UNNECESSARY 55 2.20.4.3.6 ROUND_HALF_DOWN 56 2.20.4.3.7 ROUND_HALF_UP 57 2.20.4.3.8 ROUND_HALF_EVEN 58 2.20.4.4 用BigDecimal进行除法运算 60 2.20.5 系统中精确计算的原则 60 2.21 金额的JS精确计算 60 2.22 根据语种取得代码名称 62 2.23 取兑换率的Javascript函数 62 2.23.1 一个原币和一个折币getGgExchProcess 62 2.23.2 一个原币和多个折币getGgExchListProcess 63 2.23.3 多个原币和一个折币getGgExchListListProcess 63 2.23.4 关于回调函数 64 2.24 同一个Edit页面用于多模块多actionType的实现方法 64 2.25 在Action和ServiceSpringImpl中读取资源文件 65 2.26 异常管理 65 2.26.1 分类概述 65 2.26.2 异常与系统架构的关系图 66 2.26.3 异常类的使用方法 67 2.26.3.1 ExceptionCause 67 2.26.3.2 BusinessException和PermissionException 67 2.26.3.3 DataVerifyException 68 2.26.3.4 ExceptionHelper 68 2.26.3.5 应用服务器异常 69 2.27 日志管理 69 2.27.1 概述 69 2.27.2 基本用法 69 2.27.3 什么是NDC 70 2.28 校验管理 70 2.28.1 Struts2校验框架简述 70 2.28.2 Struts2校验框架应用 71 2.28.2.1 校验配置文件 71 2.28.2.2 角色Insert页面示例 71 2.28.2.3 用户Query页面示例 73 2.28.2.4 多行输入域校验 75 2.29 多语言管理 77 2.29.1 定义输入域的name属性和资源文件 77 2.29.2 用户登录语种 78 2.30 使用select…for update解决并发问题 78 2.31 新增成功/失败弹出对话框而不离开窗口 78 2.32 权限检查调用点 79 2.32.1 为查询方法增加权限控制(PowerUtils.addPower()) 79 2.32.2 为按钮增加权限控制(在平台子系统配置方法任务关联) 81 2.33 保存成功后提示alert()而不跳转页面 82 3 页面多行录入的处理方案 83 3.1 概述 83 3.2 设计思想 84 3.3 方法调用顺序 85 3.3.1 点击增加按钮时 85 3.3.2 点击删除按钮时 85 3.4 Javascript API 85 3.4.1 insertRow 85 3.4.2 deleteRow 85 3.4.3 getOrderForMulLine 86 3.4.4 getFirstOrderForMulLine 86 3.4.5 getLastOrderForMulLine 86 3.4.6 getRecentDeletedTBody 87 3.4.7 getInnerOrderForMulLine 88 3.4.8 getTableOrderForMulLine 88 3.5 举例 88 3.5.1 两层嵌套的多行输入域举例 88 3.5.1.1 样例演示 88 3.5.1.2 内层和外层嵌套的关系图 92 3.5.1.3 注意事项 93 3.5.2 三层嵌套的多行输入域举例 93 3.5.2.1 样例演示 93 3.5.2.2 三层嵌套的关系图 94 3.5.3 四层嵌套的多行输入域举例 95 3.5.3.1 样例演示 95 3.5.3.2 四层嵌套的关系图 95 4 JSP页面风格规范 95 4.1 新增/修改页面风格 95 4.2 查询条件页面风格 97 4.3 查询结果页面风格 98 5 缓存管理方案 99 5.1 EHCache介绍 99 5.2 应用EHCache 99 6 系统的JSP标签库 100 6.1 双击域 100 6.2 103 6.3 103 6.4 104 6.5 104 6.6 105 6.7 105 7 系统基础类库 106 7.1 ins.framework.dao 106 7.1.1 GenericDao 106 7.1.2 EntityDaoHibernate 106 7.1.3 GenericDaoHibernate 107 7.2 ins.framework.common 107 7.2.1 Page 107 7.2.2 DateTime 107 8 开发常见问题 110 8.1 informix jdbc中文配置 110 8.2 服务器启动时报Connection refused 110 8.3 OC4J不能启动和清理OC4J缓存 111 8.4 “a different object with the session identifier…”异常 111 8.5 声明对象句柄时不需要使用new关键字 112 8.6 一个POJO对象只能映射为一条数据库记录 114 8.6.1 实体对象生命周期 115 8.6.2 实体对象的识别 115 8.7 String对象、StringBuilder对象和原始数据类型的特点 116 8.7.1 String对象的“equals()”和“==” 116 8.7.2 StringBuilder对象 116 8.7.3 原始数据类型的“==” 117 8.8 代码双击域onchange之后弹出iframe窗口 117 8.9 系统登录安全认证配置 119 8.10 Service互调的实现 119 8.11 页面刷新几次后,有些输入域出现空白现象 120 9 系统遗留问题 120 10 附录 121 10.1 嵌套的多行输入域的样例文件 121 10.1.1 NestedMultiLineExampleLayer2.jsp源码 121 10.1.2 NestedMultiLineExampleLayer3.jsp源码 125 10.1.3 NestedMultiLineExampleLayer4.jsp源码 129 10.2 JSP页面风格规范样例文件 134 10.2.1 UserList.jsp 134 10.2.2 UserEdit.jsp 134

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧