BigDecimal 的奇怪舍入问题
Strange rounding issue with BigDecimal
注意这不是重复的,我指的是四舍五入;不添加。
所以我正在处理 BigDecimal,除了某些数字的舍入外,我所做的一切都按计划进行。用代码更容易解释,但是数字之间的舍入变化属性。请注意,这是一种始终向下舍入的模式(截断)。它应该四舍五入到小数点后的 6 位数字。
System.out.println( (new BigDecimal(1.340)).round(new MathContext(7, RoundingMode.DOWN))); //returns 1.400000
System.out.println( (new BigDecimal(2.340)).round(new MathContext(7, RoundingMode.DOWN))); //returns 2.339999
我了解 BigDecimal、四舍五入等。奇怪的是简单地将第一个数字从 1 更改为 2、3、4、5、... n 使值 n.339999。
换句话说,对于 n.340,其中 n > 1,以这种形式舍入得到 n.339999,而如果 n = 1,则得到 1.400000
我做错了什么?我该如何解决这个问题并使其成为 1.400000 版本?最好使用这种格式,因为我正在处理的所有其他内容(对这个问题来说不是必需的)都以这种格式工作,并以这种方式四舍五入。
不要用双精度初始化 BigDecimal。当您创建 BigDecimal 时,您已经遇到了精度问题。改用字符串:
System.out.println( (new BigDecimal("1.340")).round(new MathContext(7, RoundingMode.DOWN))); //returns 1.340
System.out.println( (new BigDecimal("2.340")).round(new MathContext(7, RoundingMode.DOWN))); //returns 2.340
注意这不是重复的,我指的是四舍五入;不添加。
所以我正在处理 BigDecimal,除了某些数字的舍入外,我所做的一切都按计划进行。用代码更容易解释,但是数字之间的舍入变化属性。请注意,这是一种始终向下舍入的模式(截断)。它应该四舍五入到小数点后的 6 位数字。
System.out.println( (new BigDecimal(1.340)).round(new MathContext(7, RoundingMode.DOWN))); //returns 1.400000
System.out.println( (new BigDecimal(2.340)).round(new MathContext(7, RoundingMode.DOWN))); //returns 2.339999
我了解 BigDecimal、四舍五入等。奇怪的是简单地将第一个数字从 1 更改为 2、3、4、5、... n 使值 n.339999。 换句话说,对于 n.340,其中 n > 1,以这种形式舍入得到 n.339999,而如果 n = 1,则得到 1.400000
我做错了什么?我该如何解决这个问题并使其成为 1.400000 版本?最好使用这种格式,因为我正在处理的所有其他内容(对这个问题来说不是必需的)都以这种格式工作,并以这种方式四舍五入。
不要用双精度初始化 BigDecimal。当您创建 BigDecimal 时,您已经遇到了精度问题。改用字符串:
System.out.println( (new BigDecimal("1.340")).round(new MathContext(7, RoundingMode.DOWN))); //returns 1.340
System.out.println( (new BigDecimal("2.340")).round(new MathContext(7, RoundingMode.DOWN))); //returns 2.340