小数舍入结果的差异

Yaw*_*war 0 java rounding bigdecimal

使用Java:

$ jshell
|  Welcome to JShell -- Version 17.0.3
|  For an introduction type: /help intro
Run Code Online (Sandbox Code Playgroud)

使用“半偶数”舍入方法,3084.5 舍入为 3084:

jshell> new java.math.BigDecimal("3084.5").setScale(0, java.math.RoundingMode.HALF_EVEN)
$13 ==> 3084
Run Code Online (Sandbox Code Playgroud)

但 3084.51 四舍五入为 3085:

jshell> new java.math.BigDecimal("3084.51").setScale(0, java.math.RoundingMode.HALF_EVEN)
$13 ==> 3085
Run Code Online (Sandbox Code Playgroud)

为什么数字会1影响舍入?它超出了5舍入操作期间应考虑的最后一位有效数字 ( ),对吧?

Mat*_*NNZ 5

根据 JavaDoc RoundingMode.HALF_EVEN

舍入模式向{@literal“最近邻居”}舍入,除非两个邻居等距,在这种情况下,向偶数邻居舍入。

0这意味着,使用您在中设置的比例.setScale()(意味着您想要 0 位小数):

  • 3084.53084和等距3085,因此它将是偶数邻居(因此3084是偶数,而不是3085奇数)。
  • 3084.51不是等距的,它比 更0.01接近,因此它将是最近邻居。30853084