大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
问题: 将两个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));
}
- 使用BigDecimal(String 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进行四舍五入
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/190386.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...