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

Aly*_*ona 4 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--;
}
Run Code Online (Sandbox Code Playgroud)

问题是我不知道如何转换doubleint没有舍入数.我只需要摆脱十进制后的所有数字.我已经尝试了(int) double,(int)Math.floor(double)并且new DecimalFormat('#').format(double).作为一个double我采取1.99999999999999999999.以上都将其转换为2.理想的结果 - 1;

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

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

kum*_*ana 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;
Run Code Online (Sandbox Code Playgroud)

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

double d = 2d;
Run Code Online (Sandbox Code Playgroud)

你会注意到,在这一点上,你还没有尝试删除小数,只保留整个部分.你只为你的double声明了一个值,并且就你而言,这个值很可能有一个小数部分.

您只能在以下情况下尝试保留整个值:

int i = (int)d;
Run Code Online (Sandbox Code Playgroud)

这里删除了小数,你的int只包含double值所包含的全部内容.

但是,在您的示例中,由于您的double值为2.0,因此将整个部分取为2.这不是四舍五入.这不仅仅是保留整个部分.

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

(如果能够操作诸如1.99999999999999999999之类的值并且它们与2.0不相同很重要,则不能使用双精度.它们没有足够的精度.您应该使用BigDecimal,使用新的BigDecimal(" 1.99999999999999999999").必须使用String而不是浮点值调用构造函数,因为浮点值无法表示所需的值.)