用整数类型处理货币

技术交流群: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机,他们输入输出都是整数,运算时比较简单的。

发布了39 篇原创文章 · 获赞 8 · 访问量 3440

猜你喜欢

转载自blog.csdn.net/qq_41555278/article/details/99712572
今日推荐