我想计算容器中可以容纳多少列。首先,我计算出可以容纳多少列,然后计算它们的边距数。之后,我检查它们是否适合边距,如果没有 - 减少一列的数量。 代码:
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等。
我需要的是获得整个部分并完全丢弃小数点后的所有内容。
答案 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()