Java 数据类型转换的骚操作和神奇现象
2024-09-05 17:43:24
问:银行用什么数据类型来表示余额?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);
最新文章
- openstack api快速入门
- jdbc java数据库连接 5)CallableStatement 接口
- 用批处理批量编译多个解决方案(.sln)
- 【Alpha阶段】第⑨次Scrum例会
- WINDOWS页式内存管理解析
- linux的库文件
- [转载] 关关采集不能生成html的问题
- vsftpd配置参数详细整理
- AS3 求两条直线的交点
- Redis附加功能之Redis事务
- php demo
- poj1823,3667
- Ubuntu 14.04 设置静态IP
- A Tour of Go Exercise: Maps
- 吃了单片机GPIO端口工作模式的大亏 ——关于强推挽输出和准双向口(弱上拉)的实际应用
- Qt经典—线程、事件与Qobject(耳目一新)
- 架构漫谈:自己开发一个Log框架
- hdu4151(二分)
- linux(2)文件和目录管理(新增,删除,复制,移动,文件和目录权限,文件查找)
- win10下安装Cygwin配置gcc编译环境