java 浮点数 精度_Java中浮点数丢失精度的解决方案

注:直接将double类型作为参数利用构造方法获得的BigDecimal对象也是不精确的。

2、方法介绍

[ 获取小数点后位数 ]

int scale()

Returns the scale of this BigDecimal.

注:涉及到无限小数的点后位数时,一定要使用有RoundingMode(舍入模式)的方法,否则在精确小数时无法使用精确模式导致报错。

[ 设置小数点后位数,精确小数 ]

> BigDecimal setScale(int newScale)

BigDecimal setScale(int newScale, int roundingMode)

或者BigDecimal setScale(int newScale, RoundingMode roundingMode)

Returns a BigDecimal whose scale is the specified value, and whose value is numerically equal to this BigDecimal's. Throws an ArithmeticException if this is not possible.

第一个方法设置的小数点后位数小于当前的小数点后位数的话,程序将会报错,应该采用指定舍入模式的方法

[ 精确的加法 ]

BigDecimal add(BigDecimal augend)

Returns a BigDecimal whose value is (this + augend), and whose scale is max(this.scale(), augend.scale()).

[ 精确的减法 ]

BigDecimal subtract(BigDecimal subtrahend)

Returns a BigDecimal whose value is (this - augend), and whose scale is max(this.scale(), augend.scale()).

[ 精确的乘法 ]

BigDecimal mutiply(BigDecimal mutiplicand)

Returns a BigDecimal whose value is (this * mutiplicand), and whose scale is (this.scale() + mutiplicand.scale()).

[ (相对)精确的除法 ]

如果商本身是有限的,那么除法将消除精度丢失,而如果商本身是无限的,那么采用舍入模式实现相对精确.

> BigDecimal divide(BigDecimal divisor)

Returns a BigDecimal whose value is (this / divisor), and whose preferred scale is (this.scale() - divisor.scale()); if the exact quotient( 商 ) cannot be represented (because it has a non-terminating decimal expansion) an ArithmeticException is thrown.

不太能理解preferred scale.

> BigDecimal divide(BigDecimal divisor, int roundingMode)

或者BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode)

Returns a BigDecimal whose value is (this / divisor), and whose scale is this.scale().

采用指定的舍入模式

> BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

或者BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)

Returns a BigDecimal whose value is (this / divisor), and whose scale is as specified.

采用指定的舍入模式

[ 舍入模式 ]

> static int ROUND_CEILING

Rounding mode to round towards positive infinity.

向正无穷方向舍入

> static int ROUND_DOWN

Rounding mode to round towards zero.

向零方向舍入

> static int ROUND_FLOOR

Rounding mode to round towards negative infinity.

向负无穷方向舍入

> static int ROUND_HALF_DOWN

Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down.

向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5

> static int ROUND_HALF_EVEN

Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor.

向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP ,如果是偶数,使用ROUND_HALF_DOWN

> static int ROUND_HALF_UP

Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up.

向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6

> static int ROUND_UNNECESSARY

Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary.

计算结果是精确的,不需要舍入模式

> static int ROUND_UP

Rounding mode to round away from zero.

向远离0的方向舍入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值