我想计算容器中可以容纳多少列。首先,我计算可以容纳多少列,然后计算它们的边距数量。之后,我检查它们是否适合页边距,如果没有,请减少一列。码:
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.99999999999、2.45、3.5959547324等。
我需要得到一个完整的部分,并完全舍弃小数点后的所有内容。
您可以通过强制转换为int来完成此操作,就像您在尝试提供的代码中所做的那样。
我了解您不满意,因为您认为找到了一种情况,即您尝试将取整该值而不是舍去小数部分。
您尝试使用值1.99999999999999999999,并且注意到将其强制转换为int会产生一个值2的int。您得出的结论是,强制转换不仅舍去了小数部分,而且四舍五入为最接近的整数2。
您的结论不正确。由于转换为int而没有获得数字2。数字2是编译器解析书面文字值1.99999999999999999999的结果。双打没有无限的精度。这意味着您无法编写所需的小数位数,并期望将其正确地保留为双精度值。双打只提供您所要询问的近似值。因此,当您键入文字值1.99999999999999999999时,编译器会知道它无法准确表示该值,而是将其视为可以用双精度表示的最接近值。
最接近1.99999999999999999999的可表示值为2。就Java编译器而言,这两个数字是一个相同的值。
所以当你写:
double d = 1.99999999999999999999d;
Java编译器将其完全等同于:
double d = 2d;
您会注意到,在这一点上,您还没有做任何删除小数点的尝试,只保留了整个部分。您只为double声明了一个值,就您而言,该值很可能具有小数部分。
仅在执行以下操作时才尝试保留全部价值:
int i = (int)d;
在这里,小数点被删除,并且您的int仅包含double值所包含的全部。
但是,在您的示例中,由于您的double值为2.0,因此将其全部取为2。这不是四舍五入。这仅是保留整个部分。
删除小数并仅保留整个部分的正确方法是强制转换为int。
(如果能够操作诸如1.99999999999999999999之类的值并且使它们与2.0不同,这对您很重要,那么您就不能使用双精度。它们没有足够的精度。您应该使用BigDecimal和new BigDecimal(“ 1.99999999999999999999“)。必须使用String而不是浮点值来调用构造函数,因为浮点值无法表示所需的值。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句