gpt4 book ai didi

java整数舍入(除法相关)

转载 作者:搜寻专家 更新时间:2023-11-01 01:25:12 25 4
gpt4 key购买 nike

令我惊讶的是,整数除法没有按预期向下舍入。

简单代码:

public class HelloMath {

public static void main(String[] args) {
for (int s=1; s< 20; s++)
{
int div = 1<<s;
int res = (int) ((float)-8/ s);
System.out.printf("Bit %d, result %d\n", s, res);
}
}

}

即使使用显式(浮点)转换,输出也是:

Bit 1, result -8
Bit 2, result -4
Bit 3, result -2
Bit 4, result -2
Bit 5, result -1
Bit 6, result -1
Bit 7, result -1
Bit 8, result -1
Bit 9, result 0
Bit 10, result 0
Bit 11, result 0
Bit 12, result 0
Bit 13, result 0
Bit 14, result 0
Bit 15, result 0
Bit 16, result 0
Bit 17, result 0
Bit 18, result 0
Bit 19, result 0

我一直期待 -1。

发生这种情况的真实代码是这样做的:

public static int fluidTo8th(int fluid)
{
if (0 == fluid)
return 0; // Technically, this isn't needed :-).
int wholePart = (fluid-1) * 8 / RealisticFluids.MAX_FLUID; // -1 gets rounding correct;
// consider fluid of exactly 1/8th.
return 1+wholePart;
}

RealisticFluids.MAX_FLUID 的值为 (1<<20)。该代码应该接受一个从 1 到 MAX_FLUID 的输入(只有当输入 block 是空气时才会出现 0),并返回一个从 0 到 7 的数字——1 到 1/8th max 是 0, 1/8th +1到 2/8 是 2,到 7/8 + 1 到 8/8 是 7。

我希望整数数学能够将所有分数四舍五入。但这并没有发生——我到处都是小一错误,因为 5.999 最终变成了 6 而不是 5。

  1. 此行为记录在何处?
  2. 要使四舍五入达到我的预期,最简单的解决方法是什么?

(完整代码上下文:https://github.com/keybounce/Finite-Fluids/blob/master/src/main/java/com/mcfht/realisticfluids/Util.java)

最佳答案

I'm expecting integer math to round all fractions down.

首先,您不是在进行整数除法:您是在进行浮点除法。 (float)-8 是一个浮点表达式。因此,(float)-8/s 中的 s 在除法发生之前被提升为 (float)。

然后将 float 结果转换为 int。 Reuseman 说整数除法向零舍入。好吧,float->int 转换也向零舍入。

关于java整数舍入(除法相关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38532636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com