关于java中对小数的精确处理
来源:互联网 发布:linux修复win10引导 编辑:程序博客网 时间:2024/05/20 19:28
java 中提供BigDecimal对小数的精确处理
a) 通常用到下面的方法: 保留两位小数, 四舍五入
setScale(int newScale, int roundingMode)- newScale:保留的小数位数- roundingMode:精度取值方式
roundingMode的取值有一下几个:
- ROUND_CEILING
大于等于该数的那个最近值 - ROUND_DOWN
正数是小于等于该数的那个最近数,负数是大于等于该数的那个最近数 - ROUND_FLOOR
小于等于该数的那个值 - ROUND_HALF_DOWN
五舍六入 - ROUND_HALF_EVEN
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP ,如果是偶数,使用ROUND_HALF_DOWN - ROUND_HALF_UP
四舍五入 - ROUND_UNNECESSARY
计算结果是精确的,不需要舍入模式 - ROUND_UP
和ROUND_DOWN相反
对于double类型的小数, 保留两位小数, 然后四舍五入门
public static double round(double value) { return round(value, 2, BigDecimal.ROUND_HALF_UP); } /** * 对double数据进行取精度 * @param value double数据 * @param scale 精度位数(保留的小数位数) * @param roundingMode 精度取值方式 * @return 精度计算后的数据 */ public static double round(double value, int scale, int roundingMode) { BigDecimal bd = new BigDecimal(value); bd = bd.setScale(scale, roundingMode); double d = bd.doubleValue(); bd = null; return d; }
对于使用BigDecimal的小数精确的加, 减, 乘,除运算。
public class PreciseCompute { //默认除法运算精度 private static final int DEF_DIV_SCALE = 10; /** * 提供精确的加法运算。 */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 提供精确的减法运算。 */ public static double sub(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); } /** * 提供精确的乘法运算。 */ public static double mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 * 小数点以后10位,以后的数字四舍五入。 */ public static double div(double v1, double v2) { return div(v1, v2, DEF_DIV_SCALE); } /** * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 * 定精度,以后的数字四舍五入。 */ public static double div(double v1, double v2, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } }
运用小demo
private BigDecimal formatComma2BigDecimal(Object obj) { String val = String.valueOf(obj); if (val == null) return new BigDecimal("0.00"); val = val.replaceAll(",", ""); if (!isNumber(val)) return new BigDecimal("0.00"); BigDecimal decimal = new BigDecimal(val); decimal = decimal.setScale(2, RoundingMode.HALF_UP); return decimal; } private String formatCommaAnd2Point(Object obj) { BigDecimal decimal = formatComma2BigDecimal(obj); DecimalFormat df = new DecimalFormat("#,###.00"); String decimalStr = df.format(decimal).equals(".00")?"0.00":df.format(decimal); if(decimalStr.startsWith(".")){ decimalStr = "0"+decimalStr; } return decimalStr; } private boolean isDouble(String value) { try { Double.parseDouble(value); if (value.contains(".")) return true; return false; } catch (NumberFormatException e) { return false; } } private boolean isInteger(String value) { try { Integer.parseInt(value); return true; } catch (NumberFormatException e) { return false; } } private boolean isNumber(String value) { return isInteger(value) || isDouble(value); }
0 0
- 关于java中对小数的精确处理
- Java中对小数进行精确的运算
- Java中实现小数的精确计算
- 在Java中实现小数的精确计算
- android中对小数精度的处理
- 计算机运算中对小数的处理
- JS 关于小数的精确计算
- Java中如何精确计算小数
- Java精确计算小数
- java小数精确计算
- java中关于小数的四舍五入问题
- 小数的精确表达
- Java 小数精确计算问题
- java精确小数位数的几种方法
- 关于对小数的快速取整
- 对小数四舍五入处理
- 关于OC中的小数精确计算---NSDecimalNumber
- QTP中关于对webelement的处理。
- va_list解析
- 写给那些让我糊里糊涂的HTTP、TCP、UDP、Socket
- 原来齿轮减速机有分这么多型号的
- Linux下安装NFS共享文件资源
- 安卓开发:简单的登陆跳转_APK实现直接跳转到本CSDN博客
- 关于java中对小数的精确处理
- PHP 异步处理fsockopen 和 curl 实现
- MarkdownPad 2 在win10下html渲染错误This view has crashed
- centos 进行配置环境变量和需要注意的操作事项
- 用C语言写自己的printf函数
- iOS开发 ☞ MRC的坑
- Hibernate 查询不到数据
- AndroidStudio快捷键大全
- 百度地图POI检索