Java中向上取整时的取整模式问题

Java中向上取整时的取整模式问题,java,Java,我想使用舍入作为舍入模式。但是,当原始数字中的小数小于三个小数时,则在末尾追加1 int precision = 3; double[] values = { 1.9024999999999999, 2.1234, 2.2835, 2.04 }; for (double value : values) { BigDecimal bd1 = new BigDecimal(value); bd1 = bd1.setScale(precision, BigDecimal

我想使用舍入作为舍入模式。但是,当原始数字中的小数小于三个小数时,则在末尾追加1

  int precision = 3;
  double[] values = { 1.9024999999999999, 2.1234, 2.2835, 2.04 };
  for (double value : values) {
     BigDecimal bd1 = new BigDecimal(value);
     bd1 = bd1.setScale(precision, BigDecimal.ROUND_UP);
     System.out.println(value + "===========" + bd1.doubleValue());
  }
输出如下所示-

1.9024999999999999===========1.903

2.1234===========2.124

2.2835===========2.284

2.04===========2.041
但是,当原始数字中的小数小于3个小数时,则在末尾追加1

  int precision = 3;
  double[] values = { 1.9024999999999999, 2.1234, 2.2835, 2.04 };
  for (double value : values) {
     BigDecimal bd1 = new BigDecimal(value);
     bd1 = bd1.setScale(precision, BigDecimal.ROUND_UP);
     System.out.println(value + "===========" + bd1.doubleValue());
  }
你的值2.04实际上不是2.04。实际上是2.0400000000000003552713678800500929355621337890625,这是最接近2.04的两倍值。所以当你把它四舍五入时,它被正确地四舍五入到2.041

您使用的是BigDecimaldouble构造函数,几乎可以肯定它并没有达到您所希望的效果——请参阅以获取有关它的警告。如果您改用,它的行为将与您预期的一样

代码:

输出:

1.9024999999999999===========1.903
2.1234===========2.124
2.2835===========2.284
2.04===========2.04

我可以问一下为什么你说的是2.04的真实值吗?@dabadaba:因为这是最接近2.04的双倍值。值2.04不能用二进制浮点数精确表示。是的,我能读出来。我想这意味着无法在浮点中存储精确的2.04?@dabadaba:在二进制浮点中,这是正确的。有关二进制浮点的更多信息,请参阅它是面向C的,但基本信息适用于Java。@PoonamWaikul:这为什么会令人惊讶?该值大于1.805,因此正在对其进行四舍五入。也许你想要一个半向上的取整模式?这很难说,因为你还没有解释你想要实现什么。