代码之家  ›  专栏  ›  技术社区  ›  Alyona

如何在不取整的情况下将数字从double转换为int?

  •  4
  • Alyona  · 技术社区  · 6 年前

    我想计算容器中可以容纳多少列。首先,我计算可以容纳多少列,然后计算它们的页边距。之后,我检查它们是否与页边距匹配,如果不匹配,则将列的数量减少一个。 代码:

    int columnMargin = 50;
    double result = columnContainerHBox/minimalColumnWidth;
    int columnCount = (int) result; // here's the problem
    int numberOfMargins = columnCount - 1;
    double finalCount = columnContainerHBox/minimalColumnWidth*columnCount+columnMargin*numberOfMargins;
    if(finalCount<1){
        columnCount--;
    }
    

    问题是我不知道如何转换 double int 无舍入数。我只需要去掉小数点后的所有数字。我已经试过了 (int) double , (int)Math.floor(double) new DecimalFormat('#').format(double) 。作为一个 双重的 我拿了1.99999999999999。以上都是将其转换为2。理想结果-1;

    我的 双重的 将是完全随机的。可以是1.0、1.99999999、2.45、3.5959547324等。

    我需要的是得到一个完整的部分,完全丢弃小数点后的所有内容。

    4 回复  |  直到 6 年前
        1
  •  6
  •   kumesana    6 年前

    您可以通过强制转换为int来完成这项工作,正如您已经在代码中所做的那样,您已经尝试过了。

    我理解你感到不满意,因为你认为你找到了一个例子,当你的尝试将四舍五入而不是删除小数部分。

    您尝试使用值1.9999999999999999,但您注意到将其强制转换为int会产生值2的int。由此得出的结论是,强制转换不只是删除小数部分,而是四舍五入到最接近的整数2。

    你的结论是错误的。数字2不是作为强制转换为int的结果获得的。数字2是编译器分析写入的文字值1.99999999999999的结果。双打没有无限的精度。这意味着你不能写尽可能多的小数,并期望它能正确地保存在一个双值中。双打优惠 近似值 你的要求。因此,当您键入文字值1.9999999999999999时,编译器知道它不能准确地表示该值,而是将其作为 最近的 可以用双精度表示的值。

    最接近1.9999999999999999的可表示值为2。就Java编译器而言,这两个数字是相同的。

    所以当你写:

    double d = 1.99999999999999999999d;
    

    Java编译器把它完全等同于:

    double d = 2d;
    

    你会注意到,在这一点上,你还没有做任何尝试去减少小数,只保留整个部分。您只声明了double的值,就您而言,这个值很可能有小数部分。

    只有在以下情况下才会尝试保留整个值:

    int i = (int)d;
    

    这里的小数被删除,而int只包含double值所包含的全部内容。

    然而,在您的示例中,因为您的双精度值是2.0,所以取它的整个部分是2。这不是四舍五入。那不是别的,只保留整个部分。

    正确的方法是去掉小数,只保留整个部分,将其强制转换为int。

    (如果能够操作1.999999999999等值,并且这些值与2.0不相同,则不能使用双精度值。它们没有足够的精度。您应该使用bigdecimal和新的bigdecimal(“1.99999999999999”)。必须使用字符串而不是浮点值调用构造函数,因为浮点值不能表示所需的值。)

        2
  •  1
  •   JustinKSU    6 年前

    Math.floor() 是你要找的 https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#floor-double-

    Math.floorDiv() 在您的案例中也可能有用。

        3
  •  0
  •   Tryliom    6 年前

    我已经这样做了,但这不是一个很好的解决方案,但我有:

    public class Main {
        public static void main(String args[]) {
            double d = 1.9999;
            String s = (""+d).contains(".") ? (""+d).substring(0, (""+d).indexOf(".")) : (""+d);
            System.out.println(Integer.parseInt(s));
        }
    }
    
        4
  •  -1
  •   Corentin    6 年前

    如果我理解你的问题,你可以用 intValue()