ChatGPT解决这个技术问题 Extra ChatGPT

在Java中将double转换为整数

在 Java 中,我想将双精度数转换为整数,我知道你是否这样做:

double x = 1.5;
int y = (int)x;

你得到 y=1。如果你这样做:

int y = (int)Math.round(x);

您可能会得到 2。但是,我想知道:由于整数的双重表示有时看起来像 1.9999999998 或其他东西,是否有可能通过 Math.round() 创建的双重表示仍会导致截断数字,而不是比我们正在寻找的四舍五入的数字(即:在所代表的代码中为 1 而不是 2)?

(是的,我的意思是这样的:x 是否有任何值,其中 y 将显示一个截断而不是舍入的 x 表示的结果?)

如果是这样:有没有更好的方法可以将双精度整数转换为舍入整数而不会有截断的风险?

想出一些东西: Math.round(x) 返回一个长整数,而不是双精度数。因此:Math.round() 不可能返回一个看起来像 3.9999998 的数字。因此, int(Math.round()) 永远不需要截断任何内容,并且始终有效。

Math.round(double) 返回一个 long,而不是 double。

C
Community

是否有可能铸造通过 Math.round() 创建的双精度仍然会导致截断数字

不,round() 将始终将您的 double 舍入为正确的值,然后将其转换为 long,这将截断任何小数位。但四舍五入后,不会有任何小数部分。

以下是来自 Math.round(double) 的文档:

返回最接近参数的 long。通过加 1/2、取结果的下限并将结果转换为 long 类型,将结果四舍五入为整数。换句话说,结果等于表达式的值: (long)Math.floor(a + 0.5d)


重要的一点是舍入是在 round 方法内完成的。返回一个 long 值,可以安全地将其转换为 int(假设返回值始终在 int 范围内)。
是的。无法想象 /long/ 给 int 带来问题。明显地!应该想到这个:(
虽然确实不会因为舍入而发生截断,但由于从非常大的数字 [max double: 1.7976931348623157E308] 的 double 到小得多的 [max int: 2147483647] 的 int 的转换,您仍然可能无法获得预期的结果。只是要记住的事情。
C
Charlie

对于数据类型 Doubleint,您可以使用以下内容:

Double double = 5.00;

int integer = double.intValue();

他正在寻找一个四舍五入的值。
我认为这不会满足您对 4.99999999999 的期望(将给出 4 而不是 5)
我的说“不能取消引用双重”。
这会截断(楼层),而不是四舍五入。使用风险自负。
a
aristotll
Double perValue = 96.57;
int roundVal= (int) Math.round(perValue);

解决了我的目的。