您的位置:首页 > 其它

浮点数据的精度计算和验证

2014-02-13 10:44 309 查看
之前系统出现了一个Oracle DB抛出的异常, ORA-01438: value larger than specified precisionallowed for this column

经过测试, 这个异常是因为 输入大数字, 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: