将分数转换为十进制数

时间:2010-12-27 13:10:19

标签: java floating-point integer

我在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);
}
}

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

4 个答案:

答案 0 :(得分:10)

它不会执行任何应该说的任务。你读取双打而不是整数,十进制等值不是你打印出来的。 1/2的十进制等值是0.5。你打印5。

另外,您可以注意代码样式:变量名通常用lowerCamelCase编写,如:simpleVariable

<强>更新

现在它打印出你需要的东西。但是,你不是以正确的方式做到这一点,你的缩进仍然可以改进。

答案 1 :(得分:3)

没关系 (我没有很好地阅读作业,是吗?感谢Vladimir。) ......但有些评论:< / p>

  • 通常你想在课堂上缩进方法。
  • 标准做法是仅对类型(例如,类,接口,枚举)使用初始大写(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);
        }
    }
}

答案 2 :(得分:0)

嘿我正在考虑这个问题,看过这个来源之后我发现了一些有趣的东西,这是我计划实施的算法

  1. 首先,我将使用。转换公制中的数字 Javax.Measure系列功能和我会得到一些数字 0.3750
  2. 然后我将数字除以ONE_SIXTEENTH = 0.0625
    ONE_SIXTEENTH = 0.0625
    答案0.3750 / ONE_SIXTEENTH = 6;
  3. 所以现在我知道这里有6个十六分之一
  4. 接下来我检查6是否可以被4,6 / 4 = 1.5整除,即不是整数,所以现在仍然认为该分数为6/16英寸
  5. 接下来我检查6是否可被2,6 / 2整除 这是一个整数,所以我们将用它来重构分数
  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

    This is how I worked out how I was going to do this
    我的工作

答案 3 :(得分:0)

除法运算包含三个重要部分:

  1. 结果的标志。
  2. 不可分割的部分
  3. 小数部分

此外,在极少数情况下,当以绝对形式进行比较时,您需要处理Integer.MIN_VALUE大于Integer.MAX_VALUE的事实。

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

为减轻这种情况,我们首先应将分子和分母都转换为长正形式。这为我们提供了答案的积分部分。

两个数字的XOR仅在符号相反的情况下才具有符号1。这就解决了问题的第一部分(结果的符号)。

对于十进制部分,我们可以采用一般的除法规则,即将余数与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/3给出0.(6)

  • -2147483648/-1给出2147483648