【问题标题】:Rounding a double to turn it into an int (java)四舍五入将其转换为 int (java)
【发布时间】:2011-02-08 22:28:07
【问题描述】:

现在我正在尝试这个:

int a = round(n);

其中ndouble,但它不起作用。我究竟做错了什么?

【问题讨论】:

  • 你真的应该更详细地阐述“不工作”。发生什么了?不会发生什么?你期待什么?你有什么错误?你在同一个类中有round() 方法吗?你import static java.lang.Math.*了吗?等等。有很多方法可以对数字进行四舍五入,因此也有很多可能的答案。换句话说,您的问题含糊不清,无法以目前的形式得到合理的回答。它在黑暗中拍摄。
  • “不工作”是否意味着不四舍五入到最接近的 int、抛出异常或不向上/向下舍入?这个问题没有用答案交叉引用上下文是没有用的。

标签: java double int rounding


【解决方案1】:

sn-p中round()方法的返回类型是什么?

如果这是Math.round()方法,当输入参数为Double时返回Long。

所以,你将不得不转换返回值:

int a = (int) Math.round(doubleVar);

【讨论】:

  • 考虑使用 Math.toIntExact(long) 而不是仅仅转换为 int; double 可以包含相当多的值,如果您的 double 比您预期的大,您可能不想默默地丢弃最重要的位。
  • 我相信演员阵容是没有必要的。我不知道它是否在过去,但 round 确实返回 int。
  • @Dropout Math.round 如果给它一个浮点数,则返回一个 int,如果给它一个 double,则返回一个 long。
【解决方案2】:

如果你不喜欢 Math.round() 你也可以使用这个简单的方法:

int a = (int) (doubleVar + 0.5);

【讨论】:

  • 显然没有不喜欢Math.round()的有价值的理由:stackoverflow.com/a/6468757/1715716
  • 这个解决方案更短,不需要导入,并且可以移植到许多其他编程语言,只需进行最小的更改。根据您的平台,它甚至可能更快:stackoverflow.com/questions/12091014/…
  • 我不是在批评您的回答,因为您提到的原因,我觉得它非常有用。通过这条评论,我向那些害怕使用Math.round() 的人发表讲话,这与您提供的解决方案“字面上”相同,仅此而已。干杯。
  • 是的,就像 nehz 说的,我相信这会将 -2.1 舍入到 -1,例如。
  • @AlbertoHormazabal,你没注意到他添加了0.5吗?
【解决方案3】:

double 舍入到“最近的”整数,如下所示:

1.4 -> 1

1.6 -> 2

-2.1 -> -2

-1.3 -> -1

-1.5 -> -2

private int round(double d){
    double dAbs = Math.abs(d);
    int i = (int) dAbs;
    double result = dAbs - (double) i;
    if(result<0.5){
        return d<0 ? -i : i;            
    }else{
        return d<0 ? -(i+1) : i+1;          
    }
}

您可以根据需要更改条件(结果。

【讨论】:

  • 我同意 anivaler 的回答。但是如果你需要四舍五入到最大整数,你可以像下面这样:double decimalNumber = 4.56777; System.out.println(new Float(Math.round(decimalNumber)));输出:5
【解决方案4】:

Math.round 函数被重载 当它接收到一个浮点值时,它会给你一个 int。例如,这会起作用。

int a=Math.round(1.7f);

当它接收到一个 double 值时,它会给你一个 long,因此你必须将它类型转换为 int。

int a=(int)Math.round(1.7);

这样做是为了防止精度损失。您的双精度值是 64 位,但是您的 int 变量只能存储 32 位,因此它只是将其转换为 64 位的 long,但您可以将其类型转换为 32 位,如上所述。

【讨论】:

    【解决方案5】:
    import java.math.*;
    public class TestRound11 {
      public static void main(String args[]){
        double d = 3.1537;
        BigDecimal bd = new BigDecimal(d);
        bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);
        // output is 3.15
        System.out.println(d + " : " + round(d, 2));
        // output is 3.154
        System.out.println(d + " : " + round(d, 3));
      }
    
      public static double round(double d, int decimalPlace){
        // see the Javadoc about why we use a String in the constructor
        // http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(double)
        BigDecimal bd = new BigDecimal(Double.toString(d));
        bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);
        return bd.doubleValue();
      }
    }
    

    【讨论】:

      【解决方案6】:

      Math.round 的文档说:

      将参数四舍五入的结果返回为整数。结果 相当于(int) Math.floor(f+0.5)

      无需转换为int。可能跟过去不同了。

      【讨论】:

      • 有 2 种 Math.round 方法。接受浮点数的返回一个整数,这是正确的。但是需要双精度的返回很长。
      【解决方案7】:
      public static int round(double d) {
          if (d > 0) {
              return (int) (d + 0.5);
          } else {
              return (int) (d - 0.5);
          }
      }
      

      【讨论】:

        【解决方案8】:

        您确实需要发布一个更完整的示例,这样我们才能看到您正在尝试做什么。从您发布的内容来看,这就是我所看到的。首先,没有内置的round() 方法。你需要调用Math.round(n),或者静态导入Math.round,然后像你一样调用它。

        【讨论】:

        • java中没有全局函数,首先。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-13
        • 2014-06-02
        • 2023-03-24
        • 1970-01-01
        • 2023-01-12
        • 2011-09-10
        • 1970-01-01
        相关资源
        最近更新 更多