【问题标题】:How do I get the quotient of two ints to round up? (5/2)如何获得两个整数的商来四舍五入? (5/2)
【发布时间】:2014-01-31 13:00:54
【问题描述】:

我在我的 AP 计算机科学老师分配的一些额外学分方面遇到了一些麻烦。以下是说明: 写一个WordScrambler 方法recombine。该方法返回一个由其两个String 参数创建的String,如下所示:

  • word1的前半部分
  • word2的后半部分
  • 连接两半并返回新字符串

例如,以下几行显示了调用recombine 的一些结果。请注意,如果一个单词有奇数个字母,则单词的后半部分包含多余的字母。

这里是它给出的例子:

“苹果”+“梨”=“apar” “梨”+“苹果”=“人”

然后它说要在下面创建方法重组,只给出一行代码: private String recombine(String word1, String word2) 然后我必须创建其余部分。我做了一个测试程序只是为了看看我的想法是否正确,我可以使用length()substring() 来做(我知道我将不得不在其中使用它们一段时间),然后我会将代码更改为使用private String recombine(word1,word2) 位。所以这是我的测试代码:

public class test
{
    private static String word1,word2;
    public static void main(String[]args){
       word1 = "apple";
       word2 = "pear";
       int length1 = word1.length();
       int length2 = word2.length();
       System.out.println(length1);
       System.out.println(length2);
       int half1 = (int)Math.ceil(length1 / 2);
       int half2 = length2 / 2;
       System.out.println(half1);
       System.out.println(half2);

    }
}

输出是: 5 4 2 2 如您所见,变量 half1 应该是 2.5,但由于您不能使用半个字母,它应该向上取整,但即使使用 (int)Math.ceil 它仍然向下取整。当我取出 int,只是想看看它是否可以作为双精度使用时,它给了我一个错误,“可能失去精度,需要:int;发现:双;`

【问题讨论】:

  • 所有答案的问题在于它们只是专门针对第一个单词较长的情况。苹果/梨的例子只是一个例子,实际的并没有发布给我。我毫不怀疑,也会有单词 2 更长的单词。我不确定这在那种情况下是否有效(我无法测试,因为我现在在学校,我的计算机科学老师正在讲课,事实上我不应该输入这个)。
  • 另外,即使这可行,我如何使它适合'私有字符串重组(word1,word2)`?
  • 是的,刚刚发现它确实适用于int half1 = (length1+1)/2 现在我只需要知道如何将它添加到private String recombine(word1,word2)

标签: java string int double bluej


【解决方案1】:

对于您的问题,对于两个正数 ab 的商,一般答案是使用大多数编程语言所具有的截断除法来计算 (*) (a + b - 1) / b。这会产生紧邻实际a / b 上方的整数。

在您的示例中,b 为 2。length1 / 2 向上取整的值可以计算为 (length1 + 1) / 2

(*) 这是假设 a + b - 1 可以在没有溢出的情况下计算,这在您的示例中应该不是问题。

【讨论】:

  • 请注意,如果溢出一个问题,它可以用long计算。
【解决方案2】:

您的代码没有四舍五入的原因是除法 length1 / 2 发生在 Math.ceil 调用之前,并且它以整数发生。

您可以在不使用Math.ceil 的情况下对除法进行四舍五入。为此,您将一个小于除数的数字加到被除数上。例如,如果要将除以 10 的结果四舍五入,则将被除数加 9:

int res = (d + 9) / 10; // Rounds up

在您的情况下,您只需在length1 中添加一个:

int half1 = (length1+1) / 2;

【讨论】:

    【解决方案3】:

    直接的解决办法就是用浮点除法:

    int half1 = (int)Math.ceil(length1 / 2.0);
    

    2 是一个 int 文字,2.0 是一个双精度文字。在2.0 存在的情况下,Java 会自动将length1 提升为两倍,因此这实际上是以下内容:

    int half1 = (int)Math.ceil((double)length1 / 2.0);
    

    但正如其他两个答案所指出的,您不需要使用浮点数。此外,双精度只有 53 位的整数精度,因此在浮点除法适用于 int 时,可能会导致 long 错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多