2012-05-16 28 views
-1

可能重复时:
Retain precision with Doubles in java
Moving decimal places over in a double表观不精确递增和显示双重价值

类是不言而喻的。如果你执行这个代码,double值看起来有些溢出,但是对于所有值都不会发生,而且,如果直接输出数字,那么输出是OK。

public class test { 
    public static void main(String[] args){ 

     for (double f=1.36; f<1.40; f+=0.01) System.out.println(f); 
      //Prints 1.36 
      //  1.37 
      //  1.3800000000000001 ??????? 
      //  1.3900000000000001 ??????? 

      System.out.println(1.36); //Prints 1.36 
      System.out.println(1.37); //Prints 1.37 
      System.out.println(1.38); //Prints 1.38 
      System.out.println(1.39); //Prints 1.39 
    } 
} 

有人可以点亮吗?如果这是一个bug,那么在代码中修复它的最好方法是什么?任何魔术解决方法?

+6

http://docs.oracle.com/cd/E19957-01/806-3568 /ncg_goldberg.html – NPE

+0

即使JEval没有正确处理像“1400 * 0.001”这样的操作(这就是我追踪错误的原因),因此我不认为是如此愚蠢的问题,因为它是投票否定 – Whimusical

+1

@ user1352530它是妥善处理的意义上,输出是完全符合规定的(就downvotes而言,这可能是因为这个问题可能每天问一次,所以通过一些搜索,你可能会发现一些东西,比如我上面发布的链接[Java常见问题](http://stackoverflow.com/tags/java/info))。 – assylias

回答

2

如果格式化这样的打印输出,你不会看到所有的小数位:

System.out.printf("%.2f",yourVariable); 
+0

谢谢,但我的变种来自一个字符串像2.333333333333,我不知道maxDecimals,所以我不能限制/四舍五入和格式化 – Whimusical

+0

不用担心这将适用于所有的小数点。 –

+0

我的意思是,如果我没有错,你的解决方案舍入到2位小数,这是完美的,如果我的值在var是1.300000000001 = 1.30,但不是如果var保留1.34565667777,因为那么我松散所有precission – Whimusical

1

尝试

for (int i= 136; i <= 140; i++) 
    System.out.println(i/100.0); 

打印

1.36 
1.37 
1.38 
1.39 
1.4 

当你打印出来一个双重的,它弥补了表示错误,所以你没有看到它。当您对浮点值执行多个算术运算时,您可能会添加舍入误差以及变得明显(要对其进行很多纠正)

+0

我要去通过aix(answerer)链接来研究基础,但我真的无法理解最流行的编程语言如何处理安全和透明的任何计算器都可以执行的基本操作......甚至不像JEval那样起作用。谢谢你! – Whimusical

+0

它使用http://en.wikipedia。org/wiki/IEEE_754-2008各种主流编程语言和CPU支持的浮点运算。计算器通常会隐藏更多数字并执行其他操作来减少明显的舍入误差。 Java只使用你的CPU支持的float和double类型。显着改变功能会增加开销并使其与其他语言不一致。 –

+0

哇,我简直不敢相信。今天我了解到,2012年计算机没有最佳方法来解决基本的14 * 0.1(1.4000000000000001)并将其存储在一个变种:) – Whimusical