对于Java 来说,对于float与double的计算都是不准确的(来自于《effect in java 》),所以对于很多系统中钱的计算要非常小心,我们在计算钱时,要么把钱的单位由元变为分,这样就把钱的计算便成为int的计算,这个是准确的,但是也可用用BigDecimal来实现浮点数精确计算:
介绍一下BigDecimal下的各种方法:
add(BigDecimal add )加法,subtract(BigDecimal substract ) 为减法,devite(BigDecimal devite)为除法,multiply(BigDecimal multiply)为乘法。
这样基本的四则运算就完了,对于除法有时候结果出现除不尽,会报no exact representable decimal result.这个异常,这个问题如何解决?
对于devite()有个重构的方法:divide(BigDecimal divisor, int roundingMode),第二个参数是对除不尽的情况的处理:
roundingMode有以下这些:
static int ROUND_CEILING 向正无穷方向舍入
static int ROUND_DOWN 向零方向舍入
static int ROUND_FLOOR 向负无穷方向舍入
static int ROUND_HALF_DOWN 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
static int ROUND_HALF_EVEN 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP ,如果是偶数,使用 ROUND_HALF_DOWN
static int ROUND_HALF_UP 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6
static int ROUND_UNNECESSARY 计算结果是精确的,不需要舍入模式
static int ROUND_UP 向远离0的方向舍入