Java Math.round()方法的奇怪行为

Java Math.round()方法的奇怪行为,java,math,jvm,rounding,Java,Math,Jvm,Rounding,在课堂上的静态方法中,我注意到一件让我无法理解的事情: 为什么?0.49999999999999的有效数字太多,一个双变量无法存储所有有效数字。因此,在编译过程中会发生隐式舍入。当您调用Math.round时,参数已经是0.5。请检查您自己:0.49999999999999999==0.5将生成true。0.4999999999999999999的有效数字太多,一个双精度变量无法全部存储。因此,在编译过程中会发生隐式舍入。当您调用Math.round时,参数已经是0.5检查您自己:0.49999

在课堂上的静态方法中,我注意到一件让我无法理解的事情:


为什么?

0.49999999999999的有效数字太多,一个双变量无法存储所有有效数字。因此,在编译过程中会发生隐式舍入。当您调用Math.round时,参数已经是0.5。请检查您自己:0.49999999999999999==0.5将生成true。

0.4999999999999999999的有效数字太多,一个双精度变量无法全部存储。因此,在编译过程中会发生隐式舍入。当您调用Math.round时,参数已经是0.5检查您自己:0.499999999999999==0.5将生成true。

@dystroy:我觉得这不像一个bug。看起来OP真的在0.5左右。请注意,最后的数字是9,而不是4。它不是重复的,也不是错误。这就是浮点数的行为。@JonSkeet你说得对。我读得太快了。@dystroy:我觉得这不像一只虫子。看起来OP真的在0.5左右。请注意,最后的数字是9,而不是4。它不是重复的,也不是错误。这就是浮点数的行为。@JonSkeet你说得对。我读得太快了,回答得很好+回答得很好+1.
Math.round(0.4999999999999999);  // is 0
Math.round(0.49999999999999999); // is 1