如何将数字从double转换为int而不进行舍入?

时间:2018-05-25 14:35:33

标签: java

我想计算容器中可以容纳多少列。首先,我计算出可以容纳多少列,然后计算它们的边距数。之后,我检查它们是否适合边距,如果没有 - 减少一列的数量。 代码:

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)。作为double我拍了1.99999999999999999999。以上都将其转换为2.理想的结果 - 1;

我的double将完全随机。它可以是1.0,1.9999999999,2.45,3.5959547324等。

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

4 个答案:

答案 0 :(得分:6)

你可以通过强制转换为int来实现,因为你已经在尝试的代码中进行了这样做。

我理解你感到不满意,因为你认为你已经找到了一个案例,当你的尝试将四舍五入而不是丢弃小数部分时。

您已尝试使用值1.99999999999999999999并且您已注意到将其强制转换为int会产生值为2的int。您从那里得出结论,转换不只是丢弃小数部分,而是四舍五入到最接近的整数2。

你的结论不正确。由于转换为int而未获得数字2。数字2是编译器解析写入的文字值1.99999999999999999999的结果。双打没有无限精度。这意味着你不能写出你想要的多少小数,并期望它正确保存在double值中。双打仅提供您所要求的近似。因此,当您键入文字值1.99999999999999999999时,编译器知道它无法准确表示该值,而是将其作为可以用double表示的最接近的值。

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

所以当你写:

double d = 1.99999999999999999999d;

Java编译器将其完全等同于:

double d = 2d;

你会注意到,此时你还没有尝试删除小数,只保留整个部分。你只为你的双倍声明了一个值,就你而言,这个值很可能只有一个小数部分。

您只尝试保留整个值:

int i = (int)d;

这里小数被删除,你的int只包含double值包含的整个部分。

然而,在你的例子中,因为你的双值是2.0,所以把它的整个部分都是2.那不是四舍五入。除了整个部分之外别无其他。

删除小数而只保留整个部分的正确方法是转换为int。

(如果能够操作诸如1.99999999999999999999之类的值并且它们与2.0不一样很重要,那么你就不能使用双精度。它们没有足够的精度。你应该使用BigDecimal,new BigDecimal(“1.99999999999999999999”)。必须使用String而不是浮点值调用构造函数,因为浮点值无法表示所需的值。)

答案 1 :(得分:1)

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

Math.floorDiv()在您的情况下也可能有用。

答案 2 :(得分:0)

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

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));
    }
}

答案 3 :(得分:-1)

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