Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.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
Java6和Java8中的舍入结果不同_Java_Rounding Error - Fatal编程技术网

Java6和Java8中的舍入结果不同

Java6和Java8中的舍入结果不同,java,rounding-error,Java,Rounding Error,我正在重写一个旧的Java6程序,该程序是用Java8编写的,用于执行一些科学计算,在这种情况下,我得到了不同的舍入操作结果 Java 6正在将类似0.49999999999999994的输入舍入为1,但Java 8正在使其成为0。我不能理解这里的问题 例如: private void foo() { System.out.println(Math.round(0.499999999999999999994)); } 对于不同的Java版本,上述代码的行为不同 如果有人能解释一下这个问

我正在重写一个旧的Java6程序,该程序是用Java8编写的,用于执行一些科学计算,在这种情况下,我得到了不同的舍入操作结果

Java 6正在将类似
0.49999999999999994
的输入舍入为
1
,但Java 8正在使其成为
0
。我不能理解这里的问题

例如:

private void foo() {
    System.out.println(Math.round(0.499999999999999999994));
}
对于不同的Java版本,上述代码的行为不同


如果有人能解释一下这个问题,那就太好了。

我想你在
Java6
中偶然发现了一个已知的bug,后来在Java7中修复了这个bug。这解释了
Java6
Java8
中奇怪的代码行为

错误信息:

更多信息和@OliverCharlesworth的精彩解释可在此帖子中找到:

摘自他的帖子:

在Java6(可能更早)中,round(x)实现为 地板(x+0.5)。这是一个规范错误,正是因为这个 病理病例。Java7不再强制执行此任务 实施


我认为您在
Java6
中偶然发现了一个已知的bug,该bug后来在Java7中修复。这解释了
Java6
Java8
中奇怪的代码行为

错误信息:

更多信息和@OliverCharlesworth的精彩解释可在此帖子中找到:

摘自他的帖子:

在Java6(可能更早)中,round(x)实现为 地板(x+0.5)。这是一个规范错误,正是因为这个 病理病例。Java7不再强制执行此任务 实施


示例的输出为
0
的原因与此不同<代码>0。999999999999999994是一个
双精度
。将double强制转换为,则会删除double值的小数点

公共类示例{
公共静态void main(字符串[]args){
双d1=0.9;
Double D1=Double.valueOf(D1);
int d1AsInt=(int)d1;
System.out.println(“d1作为int:\t”+d1AsInt);
System.out.println(“d1为int:\t”+d1.intValue());
}
}

如果依赖精确值,则应使用
BigDecimal
biginger

示例输出为
0
的原因是不同的<代码>0。999999999999999994
是一个
双精度
。将double强制转换为,则会删除double值的小数点

公共类示例{
公共静态void main(字符串[]args){
双d1=0.9;
Double D1=Double.valueOf(D1);
int d1AsInt=(int)d1;
System.out.println(“d1作为int:\t”+d1AsInt);
System.out.println(“d1为int:\t”+d1.intValue());
}
}

如果您依赖于精确值,则应使用
BigDecimal
biginger

发布java 6和java 8code@Aaron我已经包括了基本代码。感谢您的评论。发布您的java 6和java 8code@Aaron我已经包括了基本代码。谢谢你的评论。谢谢。这个问题有什么解决方法吗?以重复问题结尾可能更合适,那么fix@ShivamNegi是什么意思?它现在已经修复了,那么您是指在Java8中再次破坏它,还是将修复向后应用到Java6?修复的目的是修复代码并使用Java8。时期您的旧Java 6兼容代码依赖于一个bug,并产生不正确的结果。(如果你已经发布了这个bug有重大影响的结果,那么你应该考虑发布一个修正。)谢谢。这个问题有什么解决方法吗?以重复问题结尾可能更合适,那么fix@ShivamNegi是什么意思?它现在已经修复了,那么您是指在Java8中再次破坏它,还是将修复向后应用到Java6?修复的目的是修复代码并使用Java8。时期您的旧Java 6兼容代码依赖于一个bug,并产生不正确的结果。(如果你已经发布了这个bug有重大影响的结果,那么你应该考虑发布一个修正。)我很抱歉混淆代码。我在
Math.round()
中看到了这种行为,很抱歉混淆了代码。我在
Math.round()