JavaSE 案例练习——精算师 double精度丢失解决思路
发布网友
发布时间:2024-09-27 09:20
我来回答
共1个回答
热心网友
时间:2024-09-29 20:26
案例介绍具体的内容是这样的:编写一个程序,提示输入一个代表总钱数的双精度值,然后确定每种纸币和硬币需要的最少数量以达到输入的总钱数。假设人民币种类如下:佰圆纸钞,伍拾圆纸钞,贰拾圆纸钞,拾圆纸钞,伍圆纸钞,壹圆硬币,伍角硬币,壹角硬币,壹分硬币。例如,输入值为127.63元人民币,那么程序应当输出如下结果。
解题思考这题还是有思路的:题干中说到:确定每种纸币和硬币需要的最少数量以达到输入的总钱数。可以理解为:因此,可以编写如下的代码。
反思在输出打印剩余可换的钱的时候,可以看到,出现了特别长的小数。这是怎么回事?答案很明显,这是因为double类型,存在精度丢失的问题。那,有没有办法可以解决这个问题呢?
精度丢失在Java中常见的两种解决方案小数转整数you know 蟹不肉。整数不存在精度问题,所以常用的方式是将涉及的浮点数转成整数。而我们熟知的,int可容纳-2147483648 到 2147483647的数值。因此,这种方法,常常用在小型会计系统,而且,小型会计系统小数位是固定位数才有意义。比如 23.64元,小数位固定在两位。这个时候就可以把浮点数*100 转成整数,变成2364来计算。
使用BigDecimal大数字的精确计算就经常用到这个类: BigDecimal。唯一要注意的细节是:BigDecimal初始化时,你往构造器传入double类型数据还是会存在精度丢失。那咋办呢?那就把double用包装类Double转成String类型,把他变成String类型再传入BigDecimal构造器。兜兜转转真奇妙。