BigDecimal的ROUND_DOWN()中的坑
⼀、double类型精度缺失处理
由于计算⼩数,需要向下截取⼩数位,保留两位⼩数,但是⽤了ROUND_DOWN截取却出现了问题
public class Test {
bigdecimal除法保留小数public static void main(String args[]){
//0.03,0,06,0.09
double a = 0.09;
double b = new BigDecimal(a).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
System.out.println(b);
}
}
0.03->0.02,0.06->0.05, 0.09->0.08,但是如果是三位⼩数截取不会有问题,⼤于1,截取也不会有问题,只有2位⼩数截取两位有问题,使⽤BigDecimal.ROUND_HALF_DOWN可以避免这种情况。
这个原因在于使⽤了double类型的参数来进⾏转换,将double转换成String类型的,就可以转化正常了。感谢博友的提醒,csdn真是个好地⽅。
⼆、对于⾮⾦融领域货币的处理
在⾮⾦融类项⽬中对货币处理时, ⼀般取2位精度, 通常的设计⽅法是在运算过程中扩⼤100倍, 在需要展⽰时再缩⼩100倍, 减少精度带来的误差。所以此时价格可以设置为int型,不需要设置double型的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论