Java 工作小数点

Java 工作小数点,java,floating-point-precision,Java,Floating Point Precision,我用java写了一个关于浮点的程序,但是得到的结果不准确;而用C语言编写的同一个程序确实产生了准确的结果 代码段: public class One { public static void main(String...args){ double i, num=0.0; for(i=0;i<10;i++) num=num+0.1; System.out.println(num); } } 公共一级{ 公共静态void main(字符串…参数)

我用java写了一个关于浮点的程序,但是得到的结果不准确;而用C语言编写的同一个程序确实产生了准确的结果

代码段:

public class One {

public static void main(String...args){

    double i, num=0.0;
    for(i=0;i<10;i++)
    num=num+0.1;
    System.out.println(num);

    }
}
公共一级{
公共静态void main(字符串…参数){
双i,num=0.0;

对于(i=0;i尝试使用
BigDecimal
。浮点数字表示法是Java的一个古老的模拟点(不仅如此)

doublei;
BigDecimal num=BigDecimal.ZERO;

对于(i=0;i问题不在于Java,而在于计算机如何在二进制中表示浮点数。有些数字不可能精确表示,因此在添加
0.1
时会出现一点舍入误差。我建议您阅读详细解释。此外,还有专门设计用于在添加se时最大限度地减少错误编号顺序。

C隐藏了问题,而不是将其删除 认为C程序更精确的想法是对正在发生的事情的误解。两者都有不精确的答案,但默认情况下C已四舍五入到6位有效数字。隐藏了这一微小错误。如果您在计算中实际使用该值(例如
num==1
),您会发现两者都不准确

通常写得好的程序并不重要 一般来说,智能编写的程序可以毫不费力地处理这一微小错误。例如,您的程序每次都可以重写以重新创建一个双精度

double i, num=0.0;
for(i=0;i<10;i++)
   num=0.1*i;
   System.out.println(num);

}
double i,num=0.0;

对于(i=0;i这是
floating
数字表示中的一个问题。使用
BigDecimal

您可以理解这里的问题。如果您运行以下代码

    double i, num=0.0;
    for(i=0;i<10;i++) {
        System.out.println(num);
        num=num+0.1;
    }
    System.out.println(num);
让我们试试
BigDeciaml

 double i;
 BigDecimal num=BigDecimal.ZERO;
 for(i=0;i<10;i++) {
     System.out.println(num);
     num=num.add(new BigDecimal("0.1"));
   }
 System.out.println(num);

有一个
strictfp
关键字,如:

strictfp class Example
{
    //your code here
}

strictfp
是JavaSE2中引入的一个关键字(或与之相近的地方)浮点模型稍微放宽了一点。

为什么不使用c标记?可能的重复您是否尝试过在Java中使用等效的
printf
?您正在比较苹果和桔子。这是一种奇怪的情况,Java诚实地对待它,而c试图隐藏它,因此Java被视为不太准确,您能解释一下吗
strictfp
的意思/作用通过阅读strictfp,我可以确保所有系统上的浮点行为相同,而不是使用以10为基数的数字系统,而不是以10为基数的数字系统-2@RichardTingleBase-10与浮点无关。
strictfp
只是通过任何必要的手段确保符合IEEE754,例如使用software而不是FP指令。@EPJ这是我的观点,strictfp不会影响此问题;在base-2系统中表示base-10数字(浮点最终会导致问题,但大多数问题都是base-10-->base-2)
0.0
0.1
0.2
0.30000000000000004 // wrong value, it should be 0.3
0.4
0.5
0.6
0.7
0.7999999999999999 // this one should be 0.7+0.1=0.8
0.8999999999999999 // this should be 0.8+0.1=0.9
0.9999999999999999 // final result should be 0.9+0.1=1
 double i;
 BigDecimal num=BigDecimal.ZERO;
 for(i=0;i<10;i++) {
     System.out.println(num);
     num=num.add(new BigDecimal("0.1"));
   }
 System.out.println(num);
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
strictfp class Example
{
    //your code here
}