/*
char
|
byte-->short-->int-->long
|
float-->double
*/
箭头表示合法转换。
请问:浮点型转换的时候会失精度。为什么?float f1 = 123456789.0f;
double d1 = f1;
System.out.println(d1);
float f2 = 0.123456789f;
double d2 = f2;
System.out.println(d2);
结果:
1.23456792E8
0.12345679104328156
解决方案 »
- java 程序打印中文文件出现乱码、、且格式不对
- JDK1.5 JDialog 能设置标题图标吗?
- 推荐一本GUI入门级教程吧 最好附带下载地址
- 关于Singleton单例模式的一点疑问,高手指点
- 关于LDAP的问题,绝对高手请帮忙解决下吧,快疯掉了啊
- 谁能告诉我这是什么意思?
- 请大家帮忙看看,关于从STRING中提取WORD的问题
- 小弟kangta现在附上我的代码,请上次赐教的前辈继续指点,万分感谢!!!
- 菜鸟求助!
- java中新建一个类在非方法体内为什么不可以给另一个类中的属性赋值
- 问个不知道怎么回事的问题,前辈不要笑话啊
- java JNI中,本地C++代码访问java中返回值是String的函数
/*
char
|
byte-->short-->int-->long
|
float-->double
*/
怎么会EditPlus上显示和这里不一样
其实不是丢失精度,而是扩展精度。float只有七八位有效数字,而double有十几位有效数字。同一个数值(编码数值)在用float表示时,精度只有七八位,而再赋值给double表示时,被扩展到十几位了。
double d1 = f1;
System.out.println(d1);
float f2 = 0.12345678f;
double d2 = f2;
System.out.println(d2); 1.2345678E7
0.12345678359270096
这个要看内部表示,二进制其实无法精确表示部分十进制小数(比如0.1),所以才有了精度,
IEEE 754规定了四种表示浮点数值的方式:其中单精确度(32位元)、双精确度(64位元)、
分别是7和16个有效数字。我想float 和double应该至少满足这个标准,当二进制能精确表示这个十进制小数时,比如小数点后面有十位,那么就会输出十位,如果不能精确表示,那就截取精度的位数(或者可能比精度多一位。)
double d = 0.1234567890123456789d;
System.out.println(d);
double d1 = 1;
double d2 = 3;
System.out.println(d1/d2);是精确到16位。
0.12345678901234568
0.3333333333333333感谢你们的回答,结帖!