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
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: