如果你做过交易系统或者做过金额计算的,应该非常清楚float和double类型是尤其不适合用于货币上的计算。因为要让float和double精确到0.1是不可能的。

例如,你的账户里有1.13,花了0.82,那么结果是怎么样的呢?有些同学肯定会说,这还不简单,答案是0.31。请看下面的代码段。

System.out.println(1.13-0.82);

遗憾的告诉你,它打印出来的结果是0.30999999999999994,如下所示。

0.30999999999999994

有些同学会认为,做一下处理不就好了,四舍五入简单粗暴,但是注意这种做法并不适合有些场景。假设你账户里有1元,依次分别买了0.10元的A产品,0.20元的B产品,0.30元的C产品一直到1元(注意你是从标价为0.10的A产品开始买,直到你的余额支付不起下一个产品的价格),那么你能购买多少种呢?看下面的一段简单程序。

double money=1.00;
int products=0;
for (double price=0.10;money>=price;price+=0.10){money-=price;products++; }System.out.println("购买的产品:"+products+",还剩余额为:"+money);

结果为

购买的产品:3,还剩余额为:0.3999999999999999

当我们把double换成BigDecimal会出现什么情况呢?

BigDecimal money=new BigDecimal("1.00");
BigDecimal cents=new BigDecimal("0.10");
int products=0;
for (BigDecimal  price=cents;money.compareTo(price)>=0;price=price.add(cents)){money=money.subtract(price);products++;
}
System.out.println("购买的产品:"+products+",还剩余额为:"+money);

结果为

购买的产品:4,还剩余额为:0.00

当我们修改程序后,这个才是我们想要的结果。然而使用BigDecimal有个缺点那就是速度慢。但是对于解决这个问题,牺牲点效率不算什么。除了用BigDecimal,int和long都可以进行货币的计算。到底选int和long取决于数值的大小。总而言之,如果你想要一个精准的数值,请不要使用float和double。虽然使用BigDecimal比基本类型使用相对不方便,但是使用过BigDecimal类型的同学应该知道,它可以控制舍入,在这方面,是非常方便的。如果你考虑性能上的因素,你可以使用int或者long(注意:不超过9位十进制数字用int)。

double operator[](int i)_请谨慎使用float和double相关推荐

  1. c语言基本数据类型(short、int、long、char、float、double)

    一 C 语言包含的数据类型 short.int.long.char.float.double 这六个关键字代表C 语言里的六种基本数据类型. 在不同的系统上,这些类型占据的字节长度是不同的: 在32 ...

  2. java的int、char、long、float、double对byte的转换,在通信的时候会用到

    /** * java的int.char.long.float.double对byte的转换,在通信的时候会用到 * <ul> * <li>文件名称: com.born.util ...

  3. JAVA实体类不要使用基本类型,基本类型包含byte、int、short、long、float、double、char、boolean...

    由于JAVA的基本类型会有默认值,例如当某个类中存在private  int age;字段时,创建这个类时,age会有默认值0.当使用age属性时,它总会有值.因此在某些情况下,便无法实现age为nu ...

  4. double operator[](int i)_java中double类型精度丢失问题及解决方法

    原文链接:https://blog.csdn.net/yacolspace/article/details/78287394 double类型数据加减操作精度丢失问题 今天在项目中用到double类型 ...

  5. java中将int转换float_在java中将float和double转换为int时有什么区别?

    我用这些语句来测试 float f=4.35f; int i=(int)(f*100); System.out.println(i); double d=4.35; i=(int)(d*100); S ...

  6. mysql double 存储_关于MYSQL中FLOAT和DOUBLE类型的存储-阿里云开发者社区

    关于MYSQL中FLOAT和DOUBLE类型的存储 重庆八怪 2016-04-12 844浏览量 简介: 关于MYSQL中FLOAT和DOUBLE类型的存储 其实在单精度和双精度浮点类型存储中其存储方 ...

  7. java中byte、 int、char、long、float、double各占多少字节数?

    https://blog.csdn.net/github_34402358/article/details/100120944

  8. 如何在Java中将double转换为int?

    在本文中,我们将看到如何将double转换为int. 在Java编程中,您将有一个double原语值(例如82.14),但是要执行进一步的操作,您需要一个int值(例如82),所以让我们看看如何在Ja ...

  9. double转换成int java,Java将double转换为int

    本文概述 我们可以使用类型转换在Java中将double转换为int.要将double数据类型转换为int, 我们需要执行类型转换. Java中的类型转换通过类型转换运算符(数据类型)执行. 在这里, ...

最新文章

  1. C语言 · 求存款
  2. 项目开发中关于jquery中出现问题小结(textarea,disabled,关键字等)
  3. 安庆移动开展VoLTE网络测试
  4. IAR6.1的工程迁移到IAR6.5不能用的解决方法
  5. java动态代理_Java 动态代理和依赖注入
  6. android模拟器插件,Android模拟器插件找不到android SDK
  7. win10下安装node
  8. C#LeetCode刷题-剑指Offer
  9. python 对象(一分钟读懂)03
  10. 前端实现街道地图_来自法国的注重保护个人隐私的开源地图
  11. 如何利用msxsl绕过AppLocker?
  12. java 静态变量与静态初始化块中变量的初始化顺序
  13. prism v2之旅(7)
  14. Try Catch C++ 异常捕获
  15. 进阶10 补充知识点
  16. 深夜读萧红《呼兰河传》
  17. SAS数据导入input要点
  18. Qt中undefined reference to报错的三种可能性和解决方法(以libgdal为例)
  19. Fabric.js 自由绘制椭圆
  20. 产品经理入门:二、一个需求的奋斗史

热门文章

  1. Linux/windows com串口 java 接收数据 并解析 web程序
  2. 树状数组区间修改和区间求和
  3. sublime text3创建文件时生成头部注释
  4. 今天写了个商品采购入得存储过程,使用游标实现的,实现了多个商品库存的增加...
  5. Spring 计划 7.0
  6. (转)如何在MySql中记录SQL日志(例如Sql Server Profiler)
  7. IBatisNet概述[整理]
  8. Ubuntu21.04设置国内镜像源
  9. qlineargradient线性渐变
  10. 报错:libtool: Version mismatch error. This is libtool 2.4.6解决