繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM