大家好,又见面了,我是你们的朋友全栈君。
问题: 将两个long类型的数相除后转换为BigDecimal类型并保留两位小数。
思路: 1.先将long转换为double类型再相除 2.相除之后再转换为BigDecimal类型 3.最后是设置小数位数,并设置两位小数后面的数的处置方式。
代码:
long num1 = 5L;
long num2 = 20L;
BigDecimal num= BigDecimal.valueOf((double) num1/ num2).setScale(2, BigDecimal.ROUND_HALF_UP);
拓展: 1.为什么需要将long转换为double类型再相除?
答:如果直接用两个long类型的数相除,最后得到的结果是0.00,会丢失精度,得不到小数点后面准确的数。因为两个long类型的数相除会自动取整,所以需要转换为double类型再相除。
2.怎么将double类型的数转换为BigDecimal类型? 答: 1.使用BigDecimal的valueOf(double val)方法创建对象。
BigDecimal.valueOf(double val);
源码:
public static BigDecimal valueOf(double val) {
// Reminder: a zero double returns '0.0', so we cannot fastpath
// to use the constant ZERO. This might be important enough to
// justify a factory approach, a cache, or a few private
// constants, later.
return new BigDecimal(Double.toString(val));
}
long num1 = 5L;
long num2 = 20L;
BigDecimal bigDecimal = new BigDecimal(Double.toString((double) num1/ num2)).setScale(2, BigDecimal.ROUND_HALF_UP);
注意:
不能直接使用参数为float或double的BigDecimal创建对象,因为那样会丢失精度导致数值不准确可能得不到预期的结果,应该先转换为String再创建对象,可以看到valueOf(double val)这个方法的实现也是先转换为String再创建BigDecimal对象。
例如:四舍五入后得到的结果是0.74而不是0.75。
System.out.println(new BigDecimal(0.745).setScale(2, BigDecimal.ROUND_HALF_UP));
3.BigDecimal setScale(int newScale, int roundingMode) newScale:保留的小数位数 roundingMode:取整方式。
参考: 1.BigDecimal使用ROUND_HALF_UP进行四舍五入
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/190386.html原文链接:https://javaforall.cn