【问题标题】:Convert fraction to decimal number将分数转换为十进制数
【发布时间】:2010-12-27 13:10:18
【问题描述】:

我正在我的 Java 书中做一些练习。我对编程很陌生。因此,请注意(在代码中)我仍在第一章。现在我已经做了所有事情,我只想确认这是否合法,这样我就可以放心地继续下一步了。

如果不是,我真诚地感谢不要为我编写代码;我需要建议。

这是书中写的问题“编写一个应用程序,将分数的分子和分母提示/读取为整数,然后打印分数的十进制等值。”

我将用我的代码来说明这句话:

我在这里做了修改。这个可以吗?..

import java.util.*;
public class ExerciseEleven {
public static void main (String[] args) {
Scanner sc = new Scanner (System.in);

    double fraction;
    int fractionValue;
    int decimal;
    double value;

    System.out.println("Enter Numerator: ");
    int numerator = sc.nextInt();
    System.out.println("Enter Denominator: ");
    int denominator = sc.nextInt();

    fraction = (double) numerator / denominator;
    fractionValue = (int) (fraction * 10);
    decimal = fractionValue % 10;
    value = decimal * 0.1;


    System.out.println(value);
}
}

它编译并且工作正常。 谢谢。

【问题讨论】:

    标签: java floating-point integer


    【解决方案1】:

    它没有做它应该做的任务。您读取的是双精度而不是整数,而十进制等值不是您打印出来的。 1/2 的十进制等效值为 0.5。然后打印 5。

    另外,你可以注意你的代码风格:变量名通常用小驼峰写,比如:simpleVariable

    更新

    现在它会打印您需要的内容。但是,您这样做的方式并不正确,您的缩进仍然可以改进。

    【讨论】:

    • 感谢您的回复。 if 语句、数学课等尚未涵盖,因为我仍在第 1 章中。如果您知道如何改进它,请提供一些建议 :)
    【解决方案2】:

    没关系 (我没仔细阅读作业,是吗?感谢Vladimir。) ...但是有些cmets:

    • 通常您希望在类中缩进方法。
    • 标准做法是仅对类型(例如,类、接口、枚举)使用首字母大写 (Numerator)。变量、字段和方法名称应以小写字母开头。现在,您可以随意忽略标准做法,但如果您这样做,人们将在阅读您的代码时遇到很多麻烦。 :-)
    • 对于舍入,您可能希望查看Math.round 而不是使用强制转换截断。但作业没有说明四舍五入。
    • 您可能希望处理denominator 为零的情况。

    所以记住这些:

    import java.util.*;
    
    public class ExcerciseEleven  {
    
        public static void main (String[] args) {
            Scanner sc = new Scanner (System.in);
    
            System.out.println("Enter Numerator: ");
            int numerator = sc.nextInt();
            System.out.println("Enter Denominator: ");
            int denominator = sc.nextInt();
            if (denominator == 0) {
                System.out.println("Can't divide by zero");
            }
            else {
                double fraction = (double)numerator / denominator;
                System.out.println(fraction);
            }
        }
    }
    

    【讨论】:

    • 你忘记了接口和枚举
    • Math.round、if 语句等尚未在第一章中介绍。感谢您提供有关标准做法的提示。
    【解决方案3】:

    嘿,我正在考虑这个问题,在查看此源代码后我注意到一些有趣的事情,这是我计划实施的算法

    1. 首先,我将使用 Metric 转换数字 Javax.Measure 系列函数,我会得到一个数字 0.3750
    2. 然后我将这个数字除以 ONE_SIXTEENTH = 0.0625
      ONE_SIXTEENTH = 0.0625
      答案 0.3750 / ONE_SIXTEENTH = 6;
    3. 所以现在我知道有六分之一英寸
    4. 接下来我检查 6 是否可以被 4 整除,6/4 = 1.5 即不是整数,所以现在仍将分数视为 6/16 英寸
    5. 接下来我检查 6 是否能被 2 整除,6/2 = 3 这是一个整数,因此我们将使用它来重构分数
    6. 既然我们已经将 6 除以 2 并得到 3,则需要将 16 除以 2,最终得到 8,因此 6/16 英寸变为 3/8 英寸。

    PS 有没有人注意到这类似于 fizz bang 程序?

    ______________________________________________

    Here is the chart which helped me get my head around this


    我的工作

    【讨论】:

      【解决方案4】:

      除法运算有三个重要部分:

      1. 结果的标志。
      2. 集成部分
      3. 小数部分

      此外,在以 absolute 形式比较时,您需要处理 Integer.MIN_VALUE 大于 Integer.MAX_VALUE 的事实的少数极端情况。

      例如:-2147483648/-1 以整数类型的形式划分时不能产生2147483648。原因很简单。结果类型的类型将是整数类型,整数类型变量可以容纳的最大正值是+2147483647

      为了缓解这种情况,我们首先应该将分子和分母都转换为长正数形式。这给了我们答案的整体部分。

      两个数字的 XOR 将具有符号位 1 仅在它们具有相反符号的情况下。这解决了问题的第一部分(sign of result)。

      对于 decimal 部分,我们可以采用一般除法规则,即将余数乘以 10 并尝试再次除法并重复。记录我们已经遇到的剩余部分,以防止循环进入无限迭代。

      public String fractionToDecimal(int A, int B) {
          StringBuilder sb = new StringBuilder((A^B) < 0 ? "-" : "");
          long a = Math.abs((long)A);
          long b = Math.abs((long)B);
          sb.append(Long.toString(a/b));
      
          long rem = a % b; 
          sb.append((rem != 0) ? "." : "");
          Map<Long, Integer> remainderMap = new HashMap<>();
          int pos = 0;
          while (rem != 0){
              sb.append(Long.toString((rem*10)/b));
              remainderMap.put(rem, pos++);
              rem = (rem*10) % b;
              if (remainderMap.containsKey(rem)){
                  String currNum[] = sb.toString().split("\\.");
                  return currNum[0] + "." + currNum[1].substring(0, remainderMap.get(rem)) + 
                              "(" + currNum[1].substring(remainderMap.get(rem)) + ")";   
              }
          }
          if (sb.toString().equals("-0")) return "0"; 
          return sb.toString();
      }
      

      样本输出:

      • 2/30.(6)

      • -2147483648/-12147483648

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-06
        • 2020-06-18
        • 2017-02-19
        • 1970-01-01
        • 1970-01-01
        • 2013-05-31
        • 2018-07-04
        • 1970-01-01
        相关资源
        最近更新 更多