[英]How to convert number from double to int without rounding?
我想计算有多少列可以放入容器。 首先我计算可以容纳多少列,然后我计算它们的边距数。 之后我检查它们是否适合边距,如果没有 - 将列数减少一。 代码:
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 等。
我需要的是获取整个部分并完全丢弃小数点后的所有内容。
您可以通过强制转换为 int 来实现,正如您已经在尝试提供的代码中所做的那样。
我了解您感到不满意,因为您认为您发现了一种情况,即您的尝试将舍入该值而不是删除小数部分。
您已经尝试过使用值 1.99999999999999999999 并且您已经注意到将它转换为 int 会产生一个值为 2 的 int。您从那里得出结论,转换不仅仅是删除小数部分,而是四舍五入到最接近的整数 2。
你的结论是错误的。 数字 2 不是转换为 int 的结果。 数字 2 是编译器解析写入的文字值 1.99999999999999999999 的结果。 双打没有无限精度。 这意味着您不能根据需要编写尽可能多的小数,并期望将其正确保存为双精度值。 doubles 只提供您所要求的近似值。 因此,当您键入文字值 1.99999999999999999999 时,编译器知道它无法准确表示该值,而是将其作为可以用双精度表示的最接近的值。
并且最接近 1.99999999999999999999 的可表示值是 2。对于 Java 编译器来说,这两个数字是一相同的。
所以当你写:
double d = 1.99999999999999999999d;
Java 编译器将其完全等同于:
double d = 2d;
您会注意到,此时您还没有尝试删除小数,只保留整个部分。 你只为你的 double 声明了一个值,就你而言,这个值很可能有一个小数部分。
只有在您执行以下操作时才会尝试仅保留整个值:
int i = (int)d;
在这里小数被删除,你的 int 只包含 double 值所包含的全部部分。
但是,在您的示例中,由于您的双精度值为 2.0,因此将其整个部分取为 2。这不是四舍五入。 这就是只保留整个部分。
删除小数并只保留整个部分的正确方法是强制转换为 int。
(如果能够操作诸如 1.99999999999999999999 之类的值对您很重要并且让它们与 2.0 不同,那么您不能使用双精度数。它们没有足够的精度。您应该使用 BigDecimal 和 new BigDecimal(" 1.99999999999999999999"。必须使用字符串而不是浮点值调用构造函数,因为浮点值无法表示您想要的值。)
Math.floor()
是您正在寻找的https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#floor-double-
Math.floorDiv()
在您的情况下也可能有用。
我已经这样做了,但这不是一个很好的解决方案,但我有:
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));
}
}
如果我理解你的问题,你可以使用intValue()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.