Java故障?减法?

Java故障?减法?,java,double,subtraction,Java,Double,Subtraction,这是Java中的一个小故障吗 我去解这个表达式:3.1-7.1 我得到的答案是:-3.9999999996 这到底是怎么回事?计算机是100%的,所以在数学世界中,这是正确的,但对普通人来说却不是。Java不能在特定的数字上有错误,因为它只是以相同的方式运行的代码,但有不同的输入 附带说明:谷歌如何对数字进行四舍五入浮点舍入错误 与3*0.1!=0.3(至少在编译器未折叠时)自动类型升级正在发生,这就是结果 这里有一些可以学习的资源 下一步是学习使用格式化程序将其格式化到给定的精度/要求。这里

这是Java中的一个小故障吗

我去解这个表达式:3.1-7.1

我得到的答案是:-3.9999999996


这到底是怎么回事?

计算机是100%的,所以在数学世界中,这是正确的,但对普通人来说却不是。Java不能在特定的数字上有错误,因为它只是以相同的方式运行的代码,但有不同的输入


附带说明:谷歌如何对数字进行四舍五入

浮点舍入错误


3*0.1!=0.3
(至少在编译器未折叠时)

自动类型升级正在发生,这就是结果

这里有一些可以学习的资源


下一步是学习使用格式化程序将其格式化到给定的精度/要求。

这里可以找到一个很好的解释

浮点运算很少是精确的。而一些数字,比如 作为0.5,可以精确地表示为二进制(以2为基数)十进制(因为 0.5等于2-1),其他数字(如0.1)不能为空。因此,浮点运算可能会导致舍入错误,从而产生错误 结果接近——但不等于——您可能得到的结果 期待。例如,下面的简单计算会导致 2.60000000000001,而不是2.6:

double s=0;

for (int i=0; i<26; i++)
    s += 0.1;
System.out.println(s); 
将作为输出生成:

 0.29
  28  
这可能不是你一开始所期望的


有关更多信息,请参阅提供的参考。

正如其他几个人所提到的,如果您想获得精确的十进制值,例如在实施货币应用程序时,您不能指望
double
。你应该做的是仔细看看:


浮点运算就是目前正在发生的事情。看看和很多其他的事情。(嘿,WECSSKAFPN的文章去哪里了?)这一定是最常见的编程问题<代码>Java不能有错误??我从来没有遇到过没有bug的计算机系统……不,我的意思是在一个简单的加法中,它就像说5+5将是正确的6+5不会,那是一个处理器,但我仍然认为你是正确的!
 0.29
  28  
BigDecimal a = new BigDecimal("3.1");
BigDecimal b = new BigDecimal("7.1");
BigDecimal result = a.subtract(b);
System.out.println(result);      // Prints -4.0