为什么 System.out.println(1-0.1*9);的答案

问题描述

System.out.println(1-0.1*9);输出的结果按数学来算结果是:0.1 如果按从左到右来算也是8.1但为什结果是0.09999999999999998 这是为什么了,这是什么运算????????????????

解决方案

首先2进制无法精确显示0.10.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来做即可。 编译器在处理一个数据时,当一种类型数据无法用二进制数精确表示时,只能按照一种规则去找一个数代替(比如取最接近这个数的二进制数代替如果想让他精确可以这样System.out.printf("%.1f",2.0-1.1); 或者BigDecimal a = new BigDecimal("2.0").subtract(new BigDecimal("1.1"));System.out.println(a);
解决方案二:
《Java解惑》这本书中有关于这个问题的解释,楼主可以自己研究看一下!对于精度要求很高的运算不应使用float和double运算,应该使用BigDecimal!
解决方案三:
能用int就不用float ,能用float就不用double。例如:System.out.println((float)(1-0.1*9));
解决方案四:
http://www.iteye.com/problems/26677public 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 值的最短表示就是你所 看到的打印出来的那个可恶的数字。 更一般地说,问题在于并不是所有的小数都可以用二进制浮点数来精确表示的。
解决方案五:
因为十进制的有限浮点数,转换成二进制可能就不是有限小数了,可能变成了无限小数,而计算机存储一个浮点数的空间是固定的,这样就造成了不精确,在转换成十进制展现在我们面前的时候就是你看到的样子了

时间: 2024-11-01 19:01:56

为什么 System.out.println(1-0.1*9);的答案的相关文章

System.out.println(1 - 0.7); 打印结果问题,这么会是:0.30000000000000004 ?

问题描述 System.out.println(1 - 0.3 );System.out.println(1 - 0.7 ); System.out.println(1 - 0.8 ); System.out.println(1 - 0.9 ); 打印的结果是: 0.70.300000000000000040.199999999999999960.09999999999999998 谁知道原因吗? 解决方案 java中默认浮点数的加减,返回的double型 这和数据类型的精度有关

System.out.println() 和 log4j 的 Logger 循环输出100万次。

log4j配置参考: http://javapub.iteye.com/blog/866664 循环代码如下 system循环.       耗时,11691 package com; public class TestStaticClassMain { public static void main(String[] args) { long start = System.currentTimeMillis() ; for (int i = 0; i < 1000000; i++) { Sys

请解释一下:System.out.println(data)

问题描述 println()不是静态方法,为啥能这样用?out.println(data)请各位详解一下:System.out.println(data),谢谢啦 解决方案 解决方案二:为毛要知道这个?解决方案三:因为out是个对象参考api:http://dlc.sun.com.edgesuite.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/html/zh_CN/api/index.htmlpublicstaticfina

java代码-JAVA语言,{System.out.println(&amp;amp;quot;x=&amp;amp;quot;+x);}这大括号可以去掉?去掉有什不好

问题描述 JAVA语言,{System.out.println("x="+x);}这大括号可以去掉?去掉有什不好 class Qi111 { public static void main(String[] args) { for (int x=0;x<=100 ;x++ ) { if (x%7==0) {System.out.println("x="+x);} } } } 解决方案 可以去掉,没有什么不好.if 后面就一行,不会引起歧义.如果多行,最好加上{

java-请教大神,请教大神!!为啥system.out.println(012)输出的是10?

问题描述 请教大神,请教大神!!为啥system.out.println(012)输出的是10? 为啥system.out.println(012)输出的是10? 解决方案 以0开始表示8进制,以0x开始表示16进制.println方法默认会按10进制输出.你可以输出0x12试试 解决方案二: java里面0开头的数字表示的是八进制数,也就是说012是八进制数,所以输出的就是10,

.bat中调用java程序,且得到java的输出(system.out.println)内容

问题描述 如题:在.bat中调用java程序,且得到java的输出(system.out.println)内容.我要在bat中执行"java-jarxxx.jar"并且用一个变量保存jar运行后的输出结果,jar中要么输出(system.out.println)0要么输出1,并且对结果进行判断如果变量值为0(注:变量的值是由jar运行产生的)则使用exit/B0退出,如果变量值1则使用exit/B1退出linux版的.sh代码如下:var=`java-jarxxxxx.jar${use

java中用System.out.println输出的同一行中&amp;amp;quot;\t”和“\t&amp;amp;quot;间距竟然不一样?

问题描述 这是程序源码:public class BeerSong{public static void main(String[] args){int beerNumber=99;String word="bottles";while(beerNumber>0){ if(beerNumber==1) { word="bottle"; } System.out.println(beerNumber+"t"+word+"t"

System.out.println(Integer.toString(60, 37));

问题描述 System.out.println(Integer.toString(60,37));输出结果:1oo是什么意思?是什么符号?谢谢回答! 解决方案 解决方案二:Returnsastringrepresentationofthefirstargumentintheradixspecifiedbythesecondargument.把60用37进制表示,o就类似于16进制中的A到F吧.解决方案三:publicclassSyso{publicstaticvoidmain(String[]a

for循环输出为何从第二个元素开始,加入System.out.println后恢复正常

问题描述 很奇怪,publicclassSort1{staticintt=544;publicstaticvoidmain(String[]args)throwsIOException{intt=5;TxtInputinput=newTxtInput("e:/bishe/B.txt");double[][]aaa=newdouble[t][t];input.setSource(aaa);aaa=input.get_source();doublemax=0;//locateI记录位置in