1+1cs1.5为什么卡=0

1+1+1+1+1+1+1+1+1+1+1+1×0+1=为什么等于30,不是等于1吗?
第一行末尾的1和第二行末尾的1应是一个整体11第二行末尾的1和第三行末尾的1也应是一个整体11第三行中1×0=0共2个11,8个1,1个0,和为30.
为您推荐:
其他类似问题
1+1+1+1+1+1+1+1+1+1+1+1×0+1=12
0乘任何数不是得0吗?之后0加1,不是等于1吗?
是啊,1×0=0,所以原式等于12个1相加,就等于12了
扫描下载二维码4383人阅读
《java 解惑》学习笔记(46)
Java代码&&
public&static&void&main(String[]&args)&{&&
&&&&System.out.println(1.0&-&0.1);&&
&&&&System.out.println(1.0&-&0.2);&&
&&&&System.out.println(1.0&-&0.3);&&
&&&&System.out.println(1.0&-&0.4);&&
&&&&System.out.println(1.0&-&0.5);&&
&&&&System.out.println(1.0&-&0.6);&&
&&&&System.out.println(1.0&-&0.7);&&
&&&&System.out.println(1.0&-&0.8);&&
&&&&System.out.println(1.0&-&0.9);&&
&&&&System.out.println(1.0&-&1.0);&&
最后输出的结果为神马是&
Java代码&&
为什么呢?&
简单的说,问题处在&IEEE
754 floating-point arithmetic&,虽然在java是遵循这个规则的,但是java语言的实现,并不是使用小数点或者十进制来表示数字,相反,它是采用分数和指数来表示,而且是
uses binary fractions and exponents to represent
使用二进制的,我们可以举个例子:&
Java代码&&
0.5&=&1/2&&
0.75&=&1/2&+&1/(2^2)&&
0.85&=&1/2&+&1/(2^2)&+&1/(2^3)&&
0.1&=&1/(2^4)&+&1/(2^5)&+&1/(2^8)&+&...&&
注意,0.1只能是无限循环下去的,这就意味着0.1在java里面不能够准确的用浮点数来表示,也就造成了浮点数运算上面的误差。&
举个例子:&
Java代码&&
if&(0.1&+&0.1&+&0.1&!=&0.3)&&
&&&&System.out.println(&0.1&+&0.1&+&0.1&is&not&equal&with&0.3&);&&
&&&&System.out.println(&0.1&+&0.1&+&0.1&is&equal&to&0.3&);&&
每个人都知道,0.1 + 0.1 + 0.1 == 0.3,但是在java的实际结果却不是这样。&
更深入的话&
有人会问,为什么&
Java代码&&
System.out.println(0.1f);&&
输出的还是0.1呢?&
因为在源代码里面println调用的是Float#toString(float),最终的实现是在&
Java代码&&
public&static&String&toString(float&f)&{&&
&&&&return&new&FloatingDecimal(f).toJavaFormatString();&&
有兴趣的童鞋可以去阅读源代码,FloatingDecimal帮你做了很多事情。&
这也牵涉出另外一个话题,如何避免上面出现的问题,&
对的,就是,关于BigDecimal,我相信你们在api上面会找到更多的答案。&
BigDecimal(java.lang.String)&
BigDecimal(double) or BigDecimal(float)&
为什么呢?API上面写的很清楚了&
The results of this constructor can be somewhat unpredictable. One might assume that writing new BigDecimal(0.1) in Java creates a BigDecimal which is exactly equal to 0.1 (an unscaled value of 1, with a scale of 1), but it is actually equal to 0.1015625.
This is because 0.1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the value that is being passed in to the constructor is not exactly equal to 0.1, appearances notwithstanding.&
Java代码&&
System.out.println(new&BigDecimal(0.1f));&&
System.out.println(new&BigDecimal(&0.1&));&&
System.out.println(0.1f);&&
结果是不一样的&
更加更加更加深入的话&
Java代码&&
if&(0.1f&+&0.1f&+&0.1f&!=&0.3f)&&
&&&&System.out.println(&0.1&+&0.1&+&0.1&is&not&equal&to&0.3&);&&
&&&&System.out.println(&0.1&+&0.1&+&0.1&is&equal&to&0.3&);&&
if&(0.1&+&0.1&!=&0.2)&&
&&&&System.out.println(&0.1&+&0.1&is&not&equal&to&0.2&);&&
&&&&System.out.println(&0.1&+&0.1&is&equal&to&0.2&);&&
为何上面两串代码输出不一样?为何0.3d就不能用3个0.1d相加,而0.2d就可以用2个0.1d相加呢?&
原因的话,自己看下面的输出了&
Java代码&&
System.out.println(new&BigDecimal(0.2d));&&
System.out.println(new&BigDecimal(0.1d).add(new&BigDecimal(0.1d)));&&
System.out.println(new&BigDecimal(0.2f));&&
System.out.println(new&BigDecimal(0.1f).add(new&BigDecimal(0.1f)));&&
System.out.println(new&BigDecimal(0.3d));&&
System.out.println(new&BigDecimal(0.1d).add(new&BigDecimal(0.1d)).add(new&BigDecimal(0.1d)));&&
System.out.println(new&BigDecimal(0.3f));&&
System.out.println(new&BigDecimal(0.1f).add(new&BigDecimal(0.1f)).add(new&BigDecimal(0.1
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:76933次
积分:1428
积分:1428
排名:千里之外
原创:64篇
转载:35篇
(61)(17)(9)(11)(1)百度文库-信息提示
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
对不起,该文档已被删除,无法查看
15秒后,自动返回首页

我要回帖

 

随机推荐