问:银行用什么数据类型来表示余额?float还是double?

都不是!!下面说明为什么都不可以呢?

public static void main(String[] args) {
//浮点数他都是近似的,你看着一样的东西,他看来就不一样
float f_a = 0.1f;
double d_a = 0.1;
System.out.println("两个0.1的比较:"+(f_a==d_a));
float f_b =2213231213f;
float f_c =f_b + 1;
System.out.println("很大的float+1:"+(f_b == f_c));
double d_b =2213231213f;
double d_c =d_b + 1;
System.out.println("很大的double+1:"+(d_b == d_c));
}

float+1竟然还等于float,那也就是说   :王健林=马云

浮点数存在精度损失,不能应用在金融领域不允许舍去的环境下。

浮点数损失进度的原理:https://www.iteye.com/blog/xinklabi-2344952

所以金融领域用的是BigDecimal。

解决这个问题的方法是BigDecimal的类,这个类可以表示任意精度的数字

其原理是:用字符串存储数字,将其转换为数组来模拟大数,实现两个数组的数学运算,并将结果返回。

BigDecimal num12 = new BigDecimal("0.005");//用字符串转换成大数,无误差

强制类型转换 :以左为尊,左大右小,右边要服从左边自动转换

自动类型转化 :以左为尊,左小右大,右边要服从左边强制转换,高转换低可能会存在内存溢出,或者精度丢失。

//从低到高  byte->char,short->int->long->float->double
byte b = 12;
int i = b;//左边大右边自动转换成左边的int
int a = 1000;
b = a;//左边小,右边直接这样转换会报错
b =(byte) a;强制类型转换,这样就可以了,但是这样有可能会溢出

JDK7新特性,数字间可以用下划线,方便人们阅读:

int a = 1_0000_0000;//还是和正常的数字一样
int b = 200;
long c = a*b;//这样会内存溢出,因为a*b的结果还是个long类型。
long d = (long)a*b;//long*int的结果还是long
System.out.println(a);

最新文章

  1. openstack api快速入门
  2. jdbc java数据库连接 5)CallableStatement 接口
  3. 用批处理批量编译多个解决方案(.sln)
  4. 【Alpha阶段】第⑨次Scrum例会
  5. WINDOWS页式内存管理解析
  6. linux的库文件
  7. [转载] 关关采集不能生成html的问题
  8. vsftpd配置参数详细整理
  9. AS3 求两条直线的交点
  10. Redis附加功能之Redis事务
  11. php demo
  12. poj1823,3667
  13. Ubuntu 14.04 设置静态IP
  14. A Tour of Go Exercise: Maps
  15. 吃了单片机GPIO端口工作模式的大亏 ——关于强推挽输出和准双向口(弱上拉)的实际应用
  16. Qt经典—线程、事件与Qobject(耳目一新)
  17. 架构漫谈:自己开发一个Log框架
  18. hdu4151(二分)
  19. linux(2)文件和目录管理(新增,删除,复制,移动,文件和目录权限,文件查找)
  20. win10下安装Cygwin配置gcc编译环境

热门文章

  1. [组件封装]微信小程序-底部弹框
  2. System.Text.Json 序列化对所有 JSON 属性名称使用 camel 大小写
  3. 最详细的SSM(Spring+Spring MVC+MyBatis)项目搭建
  4. python浅学【网络服务中间件】之Celery
  5. 多线程之旅(Thread)
  6. java接口自动化(二) - 接口测试的用例设计
  7. FME中按照ID值过滤块参照中的多个要素
  8. linux常用命令(运维用到)
  9. coding++ :局部 Loading 加载效果
  10. 字符串中的count()方法