浮点数据的精度计算和验证
2014-02-13 10:44
309 查看
之前系统出现了一个Oracle DB抛出的异常, ORA-01438: value larger than specified precisionallowed for this column
经过测试, 这个异常是因为 输入大数字, 99999999999999999999, 精度超出DB 设置 Numeric(25,6)
以下研究了java如何来验证数据位数做数据检验:
Scale 是保留的小数位数
要注意的是保留小数位数也会纳入精度, 一般总精度公式为 整数位数 + 1 位 正负号 + 小数位数
比如 99999, 假设设置了6位小数, 则 此数的精度计算为 整数位数5 + 1位正负号 + 6位小数位 共 15位 precision = 15
经过测试, 这个异常是因为 输入大数字, 99999999999999999999, 精度超出DB 设置 Numeric(25,6)
以下研究了java如何来验证数据位数做数据检验:
private final int precision = 25; private Double validateLargeDouble(Double value){ Double result = value; if (value == null) return null; BigDecimal amt = new BigDecimal(value); amt = amt.setScale(6,BigDecimal.ROUND_HALF_UP); log.info("precision:"+ amt.precision()); if( amt.precision() > precision) { log.warn("value is larger than the ; precision " + precision + ": " + value + ", Actual precision: " + amt.precision()); result = 0.0; } log.info(result); return result; }
Scale 是保留的小数位数
要注意的是保留小数位数也会纳入精度, 一般总精度公式为 整数位数 + 1 位 正负号 + 小数位数
比如 99999, 假设设置了6位小数, 则 此数的精度计算为 整数位数5 + 1位正负号 + 6位小数位 共 15位 precision = 15
相关文章推荐
- TCP端口状态说明ESTABLISHED、TIME_WAIT
- BaseAnimation是基于开源的APP,致力于收集各种动画效果(最新版本1.3)
- 使用日期相关操作
- 弹出SQL报表的时候,出现空白的解决方法
- 常见前端面试题之HTML/CSS部分
- Oracle9i数据库Rman备份方案
- If You Want Something You’ve Never Had, You’ve Got To Do Something You’ve Never Done
- 疯狂打车背后:移动支付技术资料整理
- 高德地图使用步骤介绍
- fastpath插件错误
- asmack 断网重连方案
- NGUI ERROR:UnityException: Sprite is not rectangle-packed. TextureRect is invalid.解决
- Unity3D的断点调试功能
- 解决IOS7下tableview分割线左边短了一点
- Kobject相关
- return/enter键退出键盘
- .NET micro framework 链接
- centos 安装memcache
- 用js正则表达式检测内容中的空行
- JSP Learning