用整数类型处理货币

技术交流群:796513209

在日常生活中,最容易接触的小数就是货币,比如你给售货员10元钱买一个9.60元的商品,售货员会找你0.4元也就是4毛钱的意思,下面用程序来解决这个问题吧
public class Currency {
    public static void main(String[] args) {
        System.out.println(10.00-9.60);
    }
}

我们所期望的数字是0.4,应该就是0.4这个数字,但是程序打印的数字确是0.40000000000000036,这个到底怎么回事呢,

       这是因为在计算机中浮点数有可能(我这里只是说有可能哦)是不准确的,它只能是无限接近于准确值,而不能完全精确。为什么会这样呢?这是因为浮点数的存储规则决定的,先来看看0.4的十进制小数如何转换成二进制小数,但是发现0.4不能使用二进制正确表示,在二进制世界里它是个无限循环小数,也就是说,“展示” 都不能“展示”的,更别说在内存中存储了(浮点数存储包括三部分:符号位、指数位、尾数),可以这样理解,在十进制的世界里没有办法准确表示1/3,那在二进制的世界了当然也无法准确表示1/5了,在二进制的世界里1/5是一个无线循环小数。

这个时候各位可能要说了,那我可以对结果取整不就得了吗?代码如下:

public class Currency {
    public static void main(String[] args) {
        NumberFormat f = new DecimalFormat("#.##");
        System.out.println(f.format(10.00-9.60));
    }
}

打印出结果是0.4,这样好像是解决了哦,但是这里隐藏着一个很深的问题哦。我们想一下金融行业的计算方法,会计系统一般记录小数点后的4位小数,但是汇总、展现、报表中,则值记录小数点后的2位小数,如果使用浮点数来计算货币,在大批量的加减乘除后的结果有多大差距(这其中还会涉及到四舍五入问题)!会计系统要的就是准确,但是因为计算机的缘故不准确了,这是太苦恼了,别着急下面就看解决办法哦。

     (1)使用BigDecimal

这个是专门为弥补浮点数无法精确计算的缺憾而设计的哦,并且它本身也提供了加减乘除的常用数学算法,特别是与数据库Decimal类型映射时,bigdecimal是最优的解决方案。

     (2)使用整型

把参与运算的值扩大100倍,并转变为整型,然后在展示时在缩小100倍,这样处理的好处就是计算简单、准确,一般非金融行业应用较多。此方法还会用于某些零售pos机,他们输入输出都是整数,运算时比较简单的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值