如何将数字从double转换为int而不进行舍入?
我想计算容器中可以容纳多少列.首先,我计算出可以容纳多少列,然后计算它们的边距数.之后,我检查它们是否适合边距,如果没有 – 减少一列的数量.
码: 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.99999999999999999999.以上都将其转换为2.理想的结果 – 1; 我的双重将是完全随机的.它可以是1.0,1.9999999999,2.45,3.5959547324等. 我需要的是得到一个完整的部分并完全丢弃小数后的所有内容. 解决方法
你可以通过转换为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; 你会注意到,在这一点上,你还没有尝试删除小数,只保留整个部分.你只为你的double声明了一个值,并且就你而言,这个值很可能有一个小数部分. 您只能在以下情况下尝试保留整个值: int i = (int)d; 这里删除了小数,你的int只包含double值所包含的全部内容. 但是,在您的示例中,由于您的double值为2.0,因此将整个部分取为2.这不是四舍五入.这不仅仅是保留整个部分. 删除小数而只保留整个部分的正确方法是转换为int. (如果能够操作诸如1.99999999999999999999之类的值并且它们与2.0不相同很重要,则不能使用双精度.它们没有足够的精度.您应该使用BigDecimal,使用新的BigDecimal(“ 1.99999999999999999999“).必须使用String而不是浮点值调用构造函数,因为浮点值无法表示所需的值.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |