当前位置 : 首页 » 文章分类 :  开发  »  Java-Math

Java-Math

java.math 包


BigDecimal

浮点数精度有限,在运算过程中很有可能会损失精度,因此 Java 提供了 BigDecimal 来精确地进行小数的表示和计算。

不要直接用 double 构造 BigDecimal

使用 BigDecimal(double val) 直接构造的 BigDecimal 可能与我们的预期不符,比如 3.5d 转为 BigDecimal 后可能是 3.4999999999999…,后续如果想直接四舍五入就会得到 3

原因并不是 double 转为 BigDecimal 后损失精度,这个描述是错误的,因为本身 3.5d 这个双精度浮点值在内存里存储的可能就是 3.4999999999999999,是一个非常接近 3.5 的浮点值,转为 BigDecimal 后存储了他原本的双精度值,也就是 3.4999999999999999,但这可能不是我们想要的。我们要的是转为 BigDecimal 后还是 3.5

改为使用 BigDecimal(String val) 构造即可,比如 BigDecimal(String.valueOf(3.5d))BigDecimal(Double.toString(3.5d)),原理是 String.valueOf(double) 会调用 Double.toString(double) 方法,这个方法会对 double 的内部值做近似运算,从而得到符合我们预期的字符串表示的浮点值

https://blog.csdn.net/ystyaoshengting/article/details/52252615


double 转 BigDecimal 保留两位小数

double d = 1.000;
BigDecimal bd=new BigDecimal(d);
double d1=bd.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(d1);
输入结果:1.0

若double d=0,输出结果为0.0;
若double d=1.999,输出结果为2.0;
若double d=1.89,输出结果为1.89;

总结:使用这种写法若小数点后均为零,则保留一位小数,并且有四舍五入的规则。


下一篇 Xenon

阅读
评论
398
阅读预计1分钟
创建日期 2022-04-26
修改日期 2022-04-26
类别
标签

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论