Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:计算返回错误答案?_Java - Fatal编程技术网

Java:计算返回错误答案?

Java:计算返回错误答案?,java,Java,可能重复: 例如,像这样简单的事情: public class WrongAnswer { public static void main(String[] args) { System.out.println(100*1.1); } } 打印110.00000000000001而不是110。使用其他数字而不是100*1.1也会给出很多数字,结尾有一些不正确的随机数字 有什么想法吗?在100*1.1中,1.1是不合格的,因此默认为double,而100默认为int 因此,乘

可能重复:

例如,像这样简单的事情:

public class WrongAnswer {
  public static void main(String[] args) {
    System.out.println(100*1.1);
  }
}
打印110.00000000000001而不是110。使用其他数字而不是100*1.1也会给出很多数字,结尾有一些不正确的随机数字


有什么想法吗?

100*1.1
中,
1.1
是不合格的,因此默认为
double
,而
100
默认为
int


因此,乘法的结果也是
double
,这是由于
100
的上移,这就是为什么会得到这个结果

浮点表示法的精确度有限。这里有一个指南:

大多数浮点计算都涉及舍入错误。在您的例子中,有两个舍入错误:将(十进制)1.1转换为浮点(IEEE 754浮点中没有精确的1.1表示形式——Java使用浮点),然后乘以100。有关更多信息,请参阅优秀文章。

如回答所述,它将变为双倍格式。要打印
最接近的int/long
值,最好使用
Math.round()
函数作为:

 System.out.println(Math.round(100*1.1));
当您与更精确的数字相乘时,这一点变得非常重要,例如

    System.out.println(Math.round(100*1.199));  //--> prints 112
    System.out.println((int)(100*1.199)); //--> prints 111

欢迎来到神奇的浮点数世界,在这里,一切都是近似值,小数不重要。将强制转换复制到
int
碰巧在这里起作用,但只是出于偶然。在其他情况下,您可能会得到一个比您预期的少的结果。100.0d*1.1d给出相同的结果(110.00000000000001),但浮动没有问题:)100.0f*1.1f(110.0)这肯定不是“由于100的上移”。100是整数这一事实甚至与此无关。由于其中一个操作数是双精度的,计算总是以双精度进行。@EJP:为了使计算以双精度进行,两个操作数都应该是双精度的,这意味着
100
首先被转换为
double
,这是由于
二进制数字提升的结果100
。但是由于
1.1
double
,因此
100
被加宽以执行乘法。如果您打算执行乘法,请仔细阅读downvote@NegativeUser:请留下一些评论以了解问题。