Java 数学简单示例
我正在努力做简单的数学。a=5,b=a/2&(四舍五入),当我四舍五入时,它必须是5/2=3,c=b-a,3-5=2。我的问题是,当我除以5/2,再将其四舍五入时,b得到的是2,而不是3。有人能帮我把钱凑齐拿到3英镑吗?谢谢Java 数学简单示例,java,math,floating-point,jls,Java,Math,Floating Point,Jls,我正在努力做简单的数学。a=5,b=a/2&(四舍五入),当我四舍五入时,它必须是5/2=3,c=b-a,3-5=2。我的问题是,当我除以5/2,再将其四舍五入时,b得到的是2,而不是3。有人能帮我把钱凑齐拿到3英镑吗?谢谢 int a=5; int b=(int)Math.ceil(a/2); int c=b-a; System.out.println(b); System.out.println(c); 您应该在此行中使用浮点值2,而不是整数: int b = (int) Mat
int a=5;
int b=(int)Math.ceil(a/2);
int c=b-a;
System.out.println(b);
System.out.println(c);
您应该在此行中使用浮点值
2
,而不是整数:
int b = (int) Math.ceil(a / 2f);//also you can use "2.0" or "2d" instead of "2f"
您的版本使用int
除法(生成2
的int
值)和2f
恒力来使用浮点除法,并将a
值提升为浮点
(除法后生成浮点
值2.5
)
这是可能的,因为JLS规格适用于:
对操作数执行二进制数字提升(§5.6.2)
这就是在我们的例子中,int
和float
除法操作数的工作原理:
加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:
如果其中一个操作数的类型为double,则另一个操作数将转换为double。
否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float
您应该在此行中使用浮点值
2
,而不是整数:
int b = (int) Math.ceil(a / 2f);//also you can use "2.0" or "2d" instead of "2f"
您的版本使用int
除法(生成2
的int
值)和2f
恒力来使用浮点除法,并将a
值提升为浮点
(除法后生成浮点
值2.5
)
这是可能的,因为JLS规格适用于:
对操作数执行二进制数字提升(§5.6.2)
这就是在我们的例子中,int
和float
除法操作数的工作原理:
加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:
如果其中一个操作数的类型为double,则另一个操作数将转换为double。
否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float
您可以使用一个小技巧来加快速度:
int b =(a + 1) / 2;
因为你是用2除,如果数字是奇数加1,你会得到精确的上限舍入值。如果数字为偶数,则四舍五入将得到预期的一半
编辑
或者一般来说,如果你想计算
Math.ceil(a/b)
,你可以使用以下公式:(a+b-1)/b
,假设a和b为正。你可以使用一些小技巧来加快速度:
int b =(a + 1) / 2;
因为你是用2除,如果数字是奇数加1,你会得到精确的上限舍入值。如果数字为偶数,则四舍五入将得到预期的一半
编辑
或者一般来说,如果你想计算
Math.ceil(a/b)
,你可以用下面的公式:(a+b-1)/b
,假设a和b为正。(a/2d)
也应该起作用,以强制执行双除法。Nit:它不是浮点除法,它是浮点除法(因为2.0
是double
)。同样地,2.5
是double
,而不是float
。谢谢你的回答,你说得对。谢谢@Cootriglad,它很有用!欢迎来到Stackoverflow,别忘了在结束这个问题时标记一个答案:)(a/2d)
也应该有效,强制执行双除法。Nit:它不是浮点
除法,而是浮点除法(因为2.0
是双
)。类似地,2.5
是一个double
,而不是一个float
。谢谢你的回复,你说得对。它可以工作。谢谢@Cootriglad它的帮助!欢迎来到Stackoverflow,不要忘记标记一个被接受的答案来结束这个问题:)阅读Java中的整数算术。@haylu检查此项:阅读Java中的整数算术。@haylu检查此项:更一般地说,要将a/b
四舍五入,您需要在分子中添加b-1
:(a+b-1)/b
(假设a
和b
是正的)。是的,这概括了这个问题。感谢您指出这一点。更一般地说,要将a/b
四舍五入,您将b-1
添加到分子中:(a+b-1)/b
(假设a
和b
是正的)是的,这概括了这个问题。谢谢你指出这一点。