System.out.println(2-1.1);
2015-08-15 23:41
405 查看
System.out.println(1-0.1*9);
输出的结果按数学来算结果是:0.1 如果按从左到右来算也是8.1
但为什结果是0.09999999999999998 这是为什么了,这是什么运算????????????????
首先
2进制无法精确显示0.1
0.1 你用ieee的浮点数标准怎么表示? 后52个字节是小数,第一个字节是符号,后面11个字节是阶码。2的负几次方的和加到一起是0.1? 答案是没有。楼主试一下 2.0-0.5这样的,算出来就是精确的了。因为0.5是2的-1次方。0.75这样的 2(-1)+2(-2)都是可以精确表示的。。。。如果你想让2.0-0.1准确的话,用bigdecimal来做即可。
编译器在处理一个数据时,当一种类型数据无法用二进制数精确表示时,只能按照一种规则去找一个数代替(比如取最接近这个数的二进制数代替
如果想让他精确可以这样
Java代码
System.out.printf("%.1f",2.0-1.1);
或者
Java代码
BigDecimal a = new BigDecimal("2.0").subtract(new BigDecimal("1.1"));
System.out.println(a);
引用
public class Change{
public static void main(String args[]){
System.out.println(2.00 - 1.10);
}
}
你可能会很天真地期望该程序能够打印出0.90,但是它如何才能知道你想要打
印小数点后两位小数呢?
如果你对在Double.toString 文档中所设定的将double 类型的值转换为字符串
的规则有所了解,你就会知道该程序打印出来的小数,是足以将double 类型的
值与最靠近它的临近值区分出来的最短的小数,它在小数点之前和之后都至少有
一位。因此,看起来,该程序应该打印0.9 是合理的。
这么分析可能显得很合理,但是并不正确。如果你运行该程序,你就会发现它打
印的是0.8999999999999999
问题在于1.1 这个数字不能被精确表示成为一个double,因此它被表示成为最
接近它的double 值。该程序从2 中减去的就是这个值。遗憾的是,这个计算的
结果并不是最接近0.9 的double 值。表示结果的double 值的最短表示就是你所
看到的打印出来的那个可恶的数字。
更一般地说,问题在于并不是所有的小数都可以用二进制浮点数来精确表示的。
因为十进制的有限浮点数,转换成二进制可能就不是有限小数了,可能变成了无限小数,而计算 机存储一个浮点数的空间是固定的,这样就造成了不精确,在转换成十进制展现在我们面前的 时候就是你看到的样子了。
来源:http://www.iteye.com/problems/69889
0
输出的结果按数学来算结果是:0.1 如果按从左到右来算也是8.1
但为什结果是0.09999999999999998 这是为什么了,这是什么运算????????????????
首先
2进制无法精确显示0.1
0.1 你用ieee的浮点数标准怎么表示? 后52个字节是小数,第一个字节是符号,后面11个字节是阶码。2的负几次方的和加到一起是0.1? 答案是没有。楼主试一下 2.0-0.5这样的,算出来就是精确的了。因为0.5是2的-1次方。0.75这样的 2(-1)+2(-2)都是可以精确表示的。。。。如果你想让2.0-0.1准确的话,用bigdecimal来做即可。
编译器在处理一个数据时,当一种类型数据无法用二进制数精确表示时,只能按照一种规则去找一个数代替(比如取最接近这个数的二进制数代替
如果想让他精确可以这样
Java代码
System.out.printf("%.1f",2.0-1.1);
或者
Java代码
BigDecimal a = new BigDecimal("2.0").subtract(new BigDecimal("1.1"));
System.out.println(a);
引用
public class Change{
public static void main(String args[]){
System.out.println(2.00 - 1.10);
}
}
你可能会很天真地期望该程序能够打印出0.90,但是它如何才能知道你想要打
印小数点后两位小数呢?
如果你对在Double.toString 文档中所设定的将double 类型的值转换为字符串
的规则有所了解,你就会知道该程序打印出来的小数,是足以将double 类型的
值与最靠近它的临近值区分出来的最短的小数,它在小数点之前和之后都至少有
一位。因此,看起来,该程序应该打印0.9 是合理的。
这么分析可能显得很合理,但是并不正确。如果你运行该程序,你就会发现它打
印的是0.8999999999999999
问题在于1.1 这个数字不能被精确表示成为一个double,因此它被表示成为最
接近它的double 值。该程序从2 中减去的就是这个值。遗憾的是,这个计算的
结果并不是最接近0.9 的double 值。表示结果的double 值的最短表示就是你所
看到的打印出来的那个可恶的数字。
更一般地说,问题在于并不是所有的小数都可以用二进制浮点数来精确表示的。
因为十进制的有限浮点数,转换成二进制可能就不是有限小数了,可能变成了无限小数,而计算 机存储一个浮点数的空间是固定的,这样就造成了不精确,在转换成十进制展现在我们面前的 时候就是你看到的样子了。
来源:http://www.iteye.com/problems/69889
0
相关文章推荐
- poj 1947 Rebuilding Roads 树形dp
- 刀哥多线程自动释放池autoreleasepool
- UVa 11292 - Dragon of Loowater
- 网络路由设计基础
- SimpleDateFormat bug排查
- polya计数回顾
- vijos - P1223麦森数 (高精度乘法 + 分治 + python)
- 自己定义一个依赖属性 Wpf
- matlab通过摄像头获取图像进行处理
- NET下三种缓存机制(Winform里面的缓存使用 )
- LeetCode:Lowest Common Ancestor of a Binary Tree
- 通过GemBox.Spreadsheet完美操作Excel
- 如何让项目使用myEclipse部署成tomcat的ROOT目录
- PHP学习笔记-非常有用的 PHP 代码片段(1)
- python中的map、filter、reduce函数
- 关于导航栏全屏横滑返回
- Java基础之IO
- BZOJ1709超级弹珠
- wpf 不同状态下的图片颜色转换器
- iOS概念入门学习-OC-类的继承和派生