代码之家  ›  专栏  ›  技术社区  ›  Raghav M

被十进制格式/舍入模式弄糊涂了。边缘案例的向下功能

  •  0
  • Raghav M  · 技术社区  · 8 年前

    基于 this stackoverflow post ,我希望打印出0.59而不是0.60。

    import java.math.RoundingMode;
    import java.text.DecimalFormat;
    
    public class Test {
        public static void main(String[] args) {
            double toFormat = 0.6;
            DecimalFormat formatter = new DecimalFormat("########0.00");
            formatter.setRoundingMode(RoundingMode.DOWN);
            System.out.println(formatter.format(toFormat)); // 0.60
        }
    }
    

    0.60的最接近浮点表示为0.59999997779553950749686919152736663818359375,低于0.6。将DecimalFormat设置为RoundingMode。在Java 8中,为什么不四舍五入到0.59?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Andreas dfa    8 年前

    因为格式化代码知道 double .

    请参阅中的注释 source code of方法 shouldRoundUp(...) 课堂上 java.text.DigitList :

    一个二进制双值文本,信息的准确性 这门课需要四舍五入。

    • 对于下面的HALF\u DOWN、HALF\u EVEN、HALF\u UP舍入规则: 说明FloatingDecimal在二进制到十进制中所做的工作 转变

      考虑到连接情况,FloatingDecimal可以将 值(低于时返回等于tie的十进制数字), 或在值高于该值时将值“截断”到连接, 或者,当二进制值可以 精确转换为给定格式的十进制表示形式 浮动小数的规则(因此我们有一个精确的小数 二进制值的表示)。

      • 值,则数字列表代码必须应用预期的舍入 规则

      • 如果FloatingDecimal已将小数值四舍五入, DigitList不应在任何 上述三种舍入模式。

      • 如果FloatingDecimal已将十进制值截断为 数字列表中的结尾“5”位应将值四舍五入 以上三种舍入模式。

      只有当数字位于maximumDigits索引时,才必须考虑这一点 正好是数字集中的最后一个,否则有 该位置后的剩余数字,我们不必考虑 浮动小数的作用。

    • 对于总是转换为精确数字的其他数字 (如BigInteger、Long等),传递的预读循环布尔值 必须设置为false,并且所有小数位数必须设置为 true,提供正确的状态 对于这些情况。。